Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring集成JavaDSL:缓冲消息流并将处理程序放在单独的线程中_Java_Spring_Multithreading_Spring Integration_Spring Integration Dsl - Fatal编程技术网

Spring集成JavaDSL:缓冲消息流并将处理程序放在单独的线程中

Spring集成JavaDSL:缓冲消息流并将处理程序放在单独的线程中,java,spring,multithreading,spring-integration,spring-integration-dsl,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 databaseAct

我在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,因为在并行情况下,我有一个rabbit发布者/处理程序,它以相同的方式侦听此频道

由于数据库操作需要时间,因此我应该如何正确处理,以使“main”不会慢下来。最好是,主线程必须尽快解锁,并且应该在工作线程中继续处理。我说得对吗

我是否可以在流中引入一个缓冲区,用于从publishSubscribeChannel收集突发消息


另外,我更喜欢其他线程(池)来处理实际的发送,以便从执行流的主线程中移除负载。我很清楚Spring中的ThreadPoolTaskExecutor既有缓冲区又有线程池。它是使用它的好方法吗?如何以JavaDSL的方式使用ThreadPoolTaskExecutor

在这件事上有一个问题:

/**
 * 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) {

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

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