当前位置: 首页 > 知识库问答 >
问题:

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

子车峰
2023-03-14
// 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 Publisher/Handler,它以同样的方式监听这个通道。

既然数据库操作需要时间,我应该如何正确处理,使“主”不变慢。最好,主线程必须尽快解除阻塞,处理应该在辅助线程中继续。我说得对吗?

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

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

共有1个答案

巫马嘉祯
2023-03-14

关于这件事有ctor:

/**
 * 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();
}
 类似资料:
  • 问题内容: 我想在后台线程中运行一些Runnable。我想使用Handler,因为它便于延迟。我的意思是 凡 可运行 应当运行 后台 线程。是否可以创建这样的处理程序?是否在某个地方有“背景” Looper,或者该如何创建? PS我知道如何使用自定义类扩展Thread,但是比处理程序方式需要更多的编码工作。因此,请不要发布其他解决方案或类似的内容 如果Handler能以“干净”的方式做到这一点,我

  • 我想在后台线程中运行一些Runnable。我想使用Handler,因为它方便延迟。我的意思是 runnable应该在后台线程中运行。有可能创造这样的处理器吗?某个地方有没有“背景”Looper或者我怎么才能创建它? 附言:我知道如何使用自定义类扩展Thread来做到这一点,但它需要更多的编码工作,而不是以处理程序的方式进行。因此,请不要发布其他解决方案或类似内容 我只是想知道汉德勒是否能以“干净”

  • 我目前正在使用Android Room在Android上存储一些小数据。理论上,我使用allowMainThreadQueries()应该没有问题,因为我的所有数据都很小,但为了将来证明我的程序,我尝试将所有调用移动到一个单独的线程中。到目前为止,我在AppConfig中有一个静态处理程序,该类在应用程序初始启动时初始化,在应用程序范围内可见: DbHandler是一个扩展Handler的自定义类

  • 我正在使用netty构建一个应用程序。在应用程序中,我需要处理传入和传出的消息。要求是应用程序将发送的任何消息都应由特定的处理程序处理,进入应用程序的任何消息都应由另一个特定的处理程序处理。但是,我希望在两个处理程序之间交换消息,以便能够跟踪发送的消息响应,因为请求消息也将发送到应用程序。 请任何想法hwo实施这样的要求。这个问题听起来可能不相关,但这就是我得到的,我还不是一个网络极客。我读到的关

  • 问题内容: 我对如何使用Toast打印消息感到困惑。我需要使用它来打印来自线程的while循环的消息。我的渲染图形线程与我的活动不在同一个类中。我的意思是,它们不在同一文件中实现。有没有办法做到这一点? 问题答案: 您可以使用runOnUiThread:

  • 我们使用Vertx 3.0.0。 情况: 我们有一个带Rest处理器的主垂直面。 REST处理程序通过事件总线调用worker,如下所示: 我们有工人垂直,这就是我们执行垂直的方式: 这里是Worker实现: 如果我多次请求REST服务,那么所有消息都会在Worker中按顺序处理。为什么多线程在这里不起作用?worker多线程选项的目的是什么(文档中不清楚它到底是如何工作的)? 顺便说一句,如果我