java - Spring Integration 在没有轮询器的情况下监听队列

标签 java spring spring-integration

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

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

  1. 消息应按顺序处理。
  2. 应尽快处理消息(如果队列已空,则在 http 请求后不会延迟)。
  3. http 请求应在收到消息后立即响应,而不是在处理消息后响应,因此发送方只会知道消息已收到并进行处理。
  4. 我不想使用外部队列,例如 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/

相关文章:

java - 尝试在 jena api 中查找 RDFNode 对象的父类

java - 什么 Java 垃圾收集器清理 PermGen?

java - 自定义对象映射器 bean 更改打开 Feign 客户端/自动配置的 objectMapper bean 的默认属性

java - Spring MVC : @PathVariable form

java - 从数据库获取值时线程主 java.lang.NullPointerException 中出现异常

java - Spring org.springframework.web.multipart.support.MissingServletRequestPartException,所需的请求部分 'file' 不存在

spring-integration - Spring集成窃听和日志记录 channel 适配器日志记录问题

java - Spring 集成应用程序启动时生成种子时 CryptoAPI 意外失败

spring-integration - 如何使用 ZooKeeper 在 Spring Integration 中实现轮询器周围的分布式锁

java - Android工作室: dont work JsonArrayRequest