配置消息侦听器容器

时间:2013-09-04 13:39:18

标签: logging jms polling spring-integration

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

  1. 我无法找到有关基础Message Listener Container多久轮询队列消息的文档。我错过了什么吗?如果我正确理解以下配置,它将默认使用“DefaultMessageListenerContainer”。我看到该类扩展了AbstractPollingMessageListenerConainer。我看到一个receiveTimeout,但没有看到任何指定轮询间隔的内容。有这样的设置吗?当我按照下面的配置进行测试时,它似乎非常瞬间。我们的需求不是那么具有侵略性;我们可以很好地每30秒左右轮询一次队列。
  2. 有没有办法(可能只是一个log4j设置),当容器醒来并在队列中查找消息时,我可以记录(即使没有找到)?我们的维护团队希望即使没有发送消息也能够验证进程是否正在“运行”。换句话说,如果容器可能已挂起,他们想要一种故障排除方法。这只是一个排除挂起线程的工具,如果消息相信已被发送,但没有看到它们被接收。
  3. 我意识到我可能必须配置一个容器,而不是像下面那样接受默认值,但是如果我能完成上述事情,那我很好吗?

    <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>   
    

2 个答案:

答案 0 :(得分:0)

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

如果你打开TRACE调试,你会看到这个活动 - 但请记住这并不意味着每次往往经纪人往返,它只是询问客户是否有来自经纪人的新消息。

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

答案 1 :(得分:0)

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

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