Spring集成Java DSL-异步执行多个服务激活器?

Spring集成Java DSL-异步执行多个服务激活器?,java,spring,asynchronous,spring-integration,dsl,Java,Spring,Asynchronous,Spring Integration,Dsl,有一个作业有一个任务列表。 每个任务都有id、名称和状态 我为每个任务创建了服务激活器,如下所示: @ServiceActivator public Message<Task> execute(Message<Task> message){ //do stuff } 我已经使用上面的路由器按顺序执行了任务 但是,我需要启动作业,并行执行它的所有任务。 我不知道该怎么做。。我尝试在service activator方法上使用@Async,并使其返回void。但在这

有一个作业有一个任务列表。 每个任务都有id、名称和状态

我为每个任务创建了服务激活器,如下所示:

@ServiceActivator
public Message<Task> execute(Message<Task> message){
    //do stuff
}
我已经使用上面的路由器按顺序执行了任务

但是,我需要启动作业,并行执行它的所有任务。 我不知道该怎么做。。我尝试在service activator方法上使用
@Async
,并使其返回
void
。但在这种情况下,我如何将其链接回路由通道并使其开始下一个任务? 请帮忙。谢谢

编辑

我使用RecepientListRouter和ExecutorChannel来获得并行执行:

@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() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(5);
    executor.setMaxPoolSize(10);
    executor.setQueueCapacity(10);
    executor.initialize();
    return executor;
}
现在有3个问题: 1) 如果这是一个好方法,那么如何将有效负载的特定部分发送到每个接收方通道。假设有效负载是一个列表,我想将每个列表项发送到每个通道。 2) 如何动态设置收件人频道?从页眉开始说?还是一份清单? 3) 这真的是一个好方法吗?有没有更好的方法


提前感谢。

您的
任务路由频道
必须是
执行频道
的实例。例如:

return f -> f
            .handle("jobService", "execute")
            .channel(c -> c.executor("TaskRoutingChannel", threadPoolTaskExecutor()));
否则,是的:所有东西都是用单个
线程调用的,这对您的任务不好

更新

让我试着一个接一个地回答你们的问题,尽管听起来每个问题都必须是分开的

  • 如果确实需要向多个服务发送相同的邮件,可以使用
    routeToRecipients
    ,也可以返回
    publishSubscribe
    。甚至可以基于
    标题进行动态路由

  • 要将消息的一部分发送到每个频道,在
    .routeToRecipients()之前有足够的位置
    .split()

  • 要回答您的最后一个问题,我需要了解任务的业务需求


  • 谢谢你的回复。我想我没有在问题中指定我希望各个任务异步执行。。testTaskChannel和test2TaskChannel。。这是否意味着我必须使这两个频道同时,请检查这个线程是的,您可以将其设置为
    ExecutorChannel
    return f -> f
                .handle("jobService", "execute")
                .channel(c -> c.executor("TaskRoutingChannel", threadPoolTaskExecutor()));