0

我有以下配置,它设置了一个“MessageReader”pojo 类来处理传入的消息。这在配置时工作正常,但由于我没有太多的 Spring Integration 经验,我对下面发生的事情以及是否可以监控有一些基本的问题。

  1. 我无法找到有关底层消息侦听器容器轮询消息队列的频率的文档。我错过了什么吗?如果我正确理解了以下配置,它将默认使用“DefaultMessageListenerContainer”。我看到该类扩展了 AbstractPollingMessageListenerConainer。我看到了一个 receiveTimeout,但没有看到任何指定轮询间隔的内容。有这样的设置吗?当我使用如下所示的配置进行测试时,它似乎是瞬间完成的。我们的需求没有那么激进;我们可以每 30 秒左右轮询一次队列。
  2. 有没有一种方法(可能只是一个 log4j 设置)可以在容器唤醒并在队列中查找消息(即使没有找到)时进行记录?我们的维护团队希望能够验证该过程是否“正在运行”,即使没有发送任何消息。换句话说,如果容器可能已挂起,他们想要一种故障排除方法。这将只是一个排除挂起线程的工具,如果消息被认为已经发送,但没有看到它们被接收。

我意识到我可能必须配置一个容器而不是像下面那样接受默认值,但是如果我能完成上述事情,我就可以了?

<int:channel id="inboundChannel" />

<jms:message-driven-channel-adapter 
  connection-factory="myConnectionFactory" 
  destination="queue" channel="inboundChannel" />

<int:service-activator input-channel="inboundChannel">
  <bean class="com.myapp.MessageReader" />
</int:service-activator>   
4

2 回答 2

0

容器是消息驱动的——它总是在提供者的客户端库中阻塞一个线程(或多个线程),等待新消息到达——它不是轮询队列,而是轮询客户端。接收超时(默认为 5 秒)只是为了让容器可以对 stop() 做出反应(否则线程将在客户端中被阻塞而无法中断它 - 取决于客户端的实现)。

如果您打开 TRACE 调试,您将看到此活动 - 但请记住,这并不意味着每次都往返于代理,它只是询问客户端是否有来自代理的新消息到达。

当容器创建消费者时,代理知道它并将直接发送消息 - 队列本身没有轮询。

于 2013-09-04T15:04:23.153 回答
0

如果您使用消息侦听器,您只需定义接收回调函数,并将接收任务委托给库。从逻辑或设计的角度来看,你不是在轮询:你的函数被“立即”调用(它不是实时的,但它应该真的小于 30 秒)。

至于监控:我不会只依赖日志消息。为了检查通信渠道,我建议向您的消息侦听器发送“ping”请求。它可以通过在另一个队列上发送“pong”消息来响应(专门用于监控)。结合当前队列中等待消息的数量,以及 ping/pong 往返时间,监控系统可以决定是否操作应该查看它。

于 2013-09-04T16:16:30.263 回答