【问题标题】:Configuring Message Listener Container配置消息监听容器
【发布时间】:2013-09-08 01:20:28
【问题描述】:

我有以下配置,它设置了一个“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>   

【问题讨论】:

    标签: logging jms polling spring-integration


    【解决方案1】:

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

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

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

    【讨论】:

    • 我想我明白你在说什么,但让我看看我是否说对了。听起来好像在幕后“消费者”必须从队列中轮询,并且代理位于消费者和侦听器之间的中间。侦听器(侦听来自代理的消息)将每 5 秒超时(默认情况下),如果未发出关闭,则重新开始侦听。我知道您说“队列本身没有轮询”,但实际上必须轮询队列,对吗?在这种情况下,它在“消费者”中被我们抽象出来了?
    • 这确实取决于您的 JMS 提供程序,但是,不,通常它不会那样工作。当您在会话上创建消费者时,代理会将发往该消费者的消息发送到 JMS 客户端库。通常,它将有一个线程从 TCP 套接字读取(阻塞等待消息)。侦听器线程在等待消息的客户端中被阻塞(每 5 秒循环一次)。当客户端线程接收到消息时,它会将其交给侦听器线程,我们就完成了 - 没有轮询 - 代理也不太可能在内部使用轮询。
    • 谢谢,加里。这开启了一个全新的理解水平;我不知道它是从这样的 TCP 套接字读取的。我接受了这个答案,因为这有助于我在低层次上理解正在发生的事情。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多