我想使用 Spring Integration 实现 HTTP 端点,它监听 http 请求,将请求数据作为消息发送到 channel ,另一个端点应该监听该 channel 上的消息并处理它们。
听起来很简单。但我想要实现的是:
- 消息应按顺序处理。
- 应尽快处理消息(如果队列已空,则在 http 请求后不会延迟)。
- http 请求应在收到消息后立即响应,而不是在处理消息后响应,因此发送方只会知道消息已收到并进行处理。
- 我不想使用外部队列,例如 RabbitMQ。
所以我需要一个 QueueChannel
为此。但如果我理解正确的话,从队列接收消息的唯一方法是轮询器。所以第2点不会得到满足。收到消息后和轮询器看到它之前会有一点延迟。
所以问题是:在 Spring Integration 中是否有任何我没有看到的简单方法来实现这一点?
当然我可以自己实现。例如,创建 SmartLifeCycle
组件,该组件监听 DirectChannel
并将消息放入 java.util.concurrent.BlockingQueue
中,并且还启动专用的线程将在此队列上等待并将消息发送到另一个 DirectChannel 进行处理。因此不会有延迟,因为只要 BlockingQueue
不为空,线程就会被解除阻塞。
这听起来像是一种“模式”——基于专用线程的两个直接 channel 之间的某种队列。
也许有一种更简单的方法,已经在 Spring Integration 中实现,但我只是因为缺乏这方面的经验而没有看到?
最佳答案
即使使用轮询器,也可以满足第 2 点 - 只需将固定延迟设置为 0 和/或增加接收超时(默认 1 秒);轮询器线程将阻塞在队列中,直到有消息到达;然后立即再次等待。
您还可以使用执行程序 channel (http 线程将其交给执行程序线程)。
关于java - Spring Integration 在没有轮询器的情况下监听队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41410979/