有一个Job有一个任务列表。 每个任务都有id,name,status。
我为每项任务创建了服务激活器,如下所示:
@ServiceActivator
public Message<Task> execute(Message<Task> message){
//do stuff
}
我为Job创建了一个网关 在Integration流程中,从网关开始:
@Bean
public IntegrationFlow startJob() {
return f -> f
.handle("jobService", "execute")
.channel("TaskRoutingChannel");
}
@Bean
public IntegrationFlow startJobTask() {
return IntegrationFlows.from("TaskRoutingChannel")
.handle("jobService", "executeTasks")
.route("headers['Destination-Channel']")
.get();
}
@Bean
public IntegrationFlow TaskFlow() {
return IntegrationFlows.from("testTaskChannel")
.handle("aTaskService", "execute")
.channel("TaskRoutingChannel")
.get();
}
@Bean
public IntegrationFlow TaskFlow2() {
return IntegrationFlows.from("test2TaskChannel")
.handle("bTaskService", "execute")
.channel("TaskRoutingChannel")
.get();
}
我已经按照上面的路由器顺序执行任务。
但是,我需要开始工作,并行执行所有任务。
我无法弄清楚如何实现这一目标。我尝试在服务激活方法上使用@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)如果这是一个好方法,我如何将有效负载的特定部分发送到每个接收方通道。假设有效载荷是List&lt;&gt;,并且我想将每个列表项发送到每个频道。 2)如何动态设置收件人渠道?从标题说?还是清单? 3)这真的是一个好方法吗?有没有一种首选的方法呢?
先谢谢。
答案 0 :(得分:3)
您的TaskRoutingChannel
必须是ExecutorChannel
的实例。例如:
return f -> f
.handle("jobService", "execute")
.channel(c -> c.executor("TaskRoutingChannel", threadPoolTaskExecutor()));
否则,是的:所有内容都是使用单个Thread
调用的,并且它不适合您的任务。
<强>更新强>
让我试着逐一回答你的问题,虽然听起来他们每个人都必须是独立的问题: - )。
如果您确实需要向多个服务发送相同的消息,可以使用routeToRecipients
,也可以返回publishSubscribe
。或者甚至可以根据header
进行动态路由,例如。
要将部分讯息发送到每个频道,.split()
.routeToRecipients()
要回答您的上一个问题,我需要了解该任务的业务要求。