Spring集成Java DSL-异步执行多个服务激活器?
有一个作业有一个任务列表。 每个任务都有id、名称和状态 我为每个任务创建了服务激活器,如下所示: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。但在这
@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()));