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

时间:2015-08-12 01:41:13

标签: java spring asynchronous spring-integration dsl

有一个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)这真的是一个好方法吗?有没有一种首选的方法呢?

先谢谢。

1 个答案:

答案 0 :(得分:3)

您的TaskRoutingChannel必须是ExecutorChannel的实例。例如:

return f -> f
            .handle("jobService", "execute")
            .channel(c -> c.executor("TaskRoutingChannel", threadPoolTaskExecutor()));

否则,是的:所有内容都是使用单个Thread调用的,并且它不适合您的任务。

<强>更新

让我试着逐一回答你的问题,虽然听起来他们每个人都必须是独立的问题: - )。

  1. 如果您确实需要向多个服务发送相同的消息,可以使用routeToRecipients,也可以返回publishSubscribe。或者甚至可以根据header进行动态路由,例如。

  2. 要将部分讯息发送到每个频道,.split()

  3. 之前就有足够的地方.routeToRecipients()
  4. 要回答您的上一个问题,我需要了解该任务的业务要求。