Spring Integration Java DSL:缓冲消息流并将处理程序放在单独的线程

时间:2017-06-13 11:47:19

标签: java spring multithreading spring-integration spring-integration-dsl

我在Spring Integration DSL中配置了一个流程:

// A custom channel Bean 
@Autowired
@Qualifier(INPUT_DATA_CHANNEL)
private PublishSubscribeChannel publishSubscribeChannel;

//A Service that can do database recording
@Autowired
private DatabaseActivator databaseActivator;

@Bean
public IntegrationFlow setupDatabaseFlow() {

    return IntegrationFlows.from(publishSubscribeChannel)
            .handle((p, h) -> databaseActivator.recordToDatabase(p))
            .get();
}

根据日志,所有内容都在线程" main" 中按顺序发生。顺便说一下,我同时使用publishSubscribeChannel我有兔子发布者/处理程序,它以同样的方式监听这个频道。

由于数据库操作需要时间,我应该如何正确处理这样的操作,以及#34; main"没有放慢速度。优选地,主线程必须尽快解除阻塞,并且处理应该在工作线程中继续。我是对的吗?

我可以在Flow中引入一个缓冲区来收集来自publishSubscribeChannel的消息吗?

此外,我更喜欢其他线程(池)来处理实际发送,以便从正在执行流的主线程中删除负载。我很清楚Spring中的ThreadPoolTask​​Executor都有一个缓冲区和一个线程池。它是一种使用它的好方法,以及如何在Java DSL中使用ThreadPoolTask​​Executor?

1 个答案:

答案 0 :(得分:0)

有关此事的责任人:

/**
 * Create a PublishSubscribeChannel that will use an {@link Executor}
 * to invoke the handlers. If this is null, each invocation will occur in
 * the message sender's thread.
 *
 * @param executor The executor.
 */
public PublishSubscribeChannel(Executor executor) {

http://docs.spring.io/spring-integration/reference/html/messaging-channels-section.html#channel-configuration-pubsubchannel

使用Java DSL,您可以声明它:

@Bean
PublishSubscribeChannel publishSubscribeChannel(Executor executor) {
    return Channels.publishSubscribe(executor).get();
}