Spring集成JavaDSL:缓冲消息流并将处理程序放在单独的线程中
我在Spring Integration DSL中配置了一个流: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
// 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();
}