Spring Integration Java DSL - Set RecepientListRou

2019-08-09 06:51发布

I have a method which needs to execute multiple tasks async'ly.. I've managed to achieve that using the following IntegrationFlow:

@Bean
public IntegrationFlow startJobTask() {
    return IntegrationFlows.from("TaskRoutingChannel")
            .handle("jobService", "executeTasks")
            .routeToRecipients(r -> r
                .recipient("testTaskChannel")
                .recipient("test2TaskChannel"))
            .get();
}

@Bean ExecutorChannel testTaskChannel(){
    return new ExecutorChannel(this.getAsyncExecutor());
}

@Bean ExecutorChannel test2TaskChannel(){
    return new ExecutorChannel(this.getAsyncExecutor());
}

@Bean
public Executor getAsyncExecutor() {
    SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor();
    return executor;
}

@Bean
public IntegrationFlow testTaskFlow() {
    return IntegrationFlows.from("testTaskChannel")
            .handle("testTaskService", "executeAsync")
            .get();
}

@Bean
public IntegrationFlow test2TaskFlow() {
    return IntegrationFlows.from("test2TaskChannel")
            .handle("test2TaskService", "executeAsync")
            .get();
}

The above flow is basically as follows:

TaskRoutingChannel calls a serviceActivator method executeTasks

executeTasks returns something like Message<List<myTask>>

this Message is routed to channels testTaskChannel and test2TaskChannel which calls their own async serviceActivator methods.

Now, the issue is that I don't want to hardcode the recipient channels. I could avoid hardcoding with normal router by setting the destination channel as a header. However, recepientListRouters don't seem to have the capability to get recipient channel name using expressions.

Is there any way to set the recipient channels dynamically?

1条回答
成全新的幸福
2楼-- · 2019-08-09 07:31

Sorry for delay first of all.

Actually the regular .route() can do that for you, because it has exactly has this option:

protected abstract Collection<MessageChannel> determineTargetChannels(Message<?> message);

So, if your header extraction returns the list of channels, the HeaderValueRouter will be able to the message to all of them.

查看更多
登录 后发表回答