Spring Integration在没有poller的情况下侦听队列

时间:2016-12-31 18:57:54

标签: java spring spring-integration

我想使用Spring Integration实现HTTP端点,Spring Integration监听http请求,将请求数据作为消息发送到通道,另一个端点应该监听此通道上的消息并处理它们。

听起来很简单。但我想要实现的目标是:

  1. 应按顺序处理邮件。
  2. 应该尽快处理消息(如果队列已经为空,则在http请求后没有延迟)。
  3. 收到消息后,应立即响应http请求,而不是在处理完消息后,发送方将只知道收到的消息需要处理。
  4. 我不想使用像RabbitMQ这样的外部队列。
  5. 所以我需要一个QueueChannel。但如果我理解正确,从队列接收消息的唯一方法是poller。所以第2点不会令人满意。收到消息后和轮询者看到它之前会有很小的延迟。

    所以问题是:在Spring Integration中有没有简单的方法来实现这一点,我不明白?

    我当然可以自己实施。例如,创建SmartLifeCycle组件,它监听DirectChannel并将消息放入java.util.concurrent.BlockingQueue,并启动一个专用线程,该线程将在此队列上等待并将消息发送到另一个DirectChannel 1}}用于处理。因此,没有延迟,因为一旦BlockingQueue不为空,线程就会被解除阻塞。

    这听起来像一个"模式" - 基于专用线程的两个直接通道之间的一些队列。

    也许有一种更简单的方法,已经在Spring Integration中实现了,由于缺乏这方面的经验,我只是看不到它?

1 个答案:

答案 0 :(得分:1)

即使使用轮询器,也可以满足第2点 - 只需将fixed-delay设置为0和/或增加接收超时(默认为1秒);轮询线程将在队列中阻塞,直到消息到达为止;然后立即再次等待。

您还可以使用执行程序通道(http线程切换到执行程序线程)。