Spring Integration Java DSL - 动态设置RecepientListRouter收件人?

时间:2015-08-12 08:05:53

标签: java asynchronous spring-integration router dsl

我有一个方法需要执行异步的多个任务。我已经设法使用以下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();
}

以上流程基本如下:

TaskRoutingChannel调用serviceActivator方法executeTasks

executeTasks会返回Message<List<myTask>>

之类的内容

Message被路由到频道testTaskChanneltest2TaskChannel 它调用自己的异步serviceActivator方法。

现在,问题是我 不想对收件人频道进行硬编码 。 通过将目标通道设置为标头,我可以避免使用普通路由器进行硬编码。但是, recepientListRouters似乎无法使用表达式获取收件人频道名称。

有没有办法动态设置收件人渠道?

1 个答案:

答案 0 :(得分:1)

首先对不起延迟。

实际上,常规.route()可以为您做到这一点,因为它确实有这个选项:

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

因此,如果您的标题提取返回了频道列表,HeaderValueRouter将能够向所有频道提供消息。