我有以下配置,它设置一个“MessageReader”pojo类来处理传入的消息。这在配置时工作正常,但由于我没有很多Spring Integration的经验,我对下面发生的事情以及是否可以监控它有一些基本的问题。
我意识到我可能必须配置一个容器,而不是像下面那样接受默认值,但是如果我能完成上述事情,那我很好吗?
<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>
答案 0 :(得分:0)
容器是消息驱动的 - 它总是在提供者的客户端库中阻塞一个线程(或多个线程),等待新消息到达 - 它不轮询队列,它正在轮询客户端。接收超时(默认为5秒)就是容器可以对stop()做出反应(否则线程将在客户端被阻塞而无法中断它 - 具体取决于客户端的实现)。
如果你打开TRACE调试,你会看到这个活动 - 但请记住这并不意味着每次往往经纪人往返,它只是询问客户是否有来自经纪人的新消息。
当容器创建消费者时,代理知道它并将直接发送消息 - 没有轮询队列本身。
答案 1 :(得分:0)
如果您正在使用消息侦听器,则只需定义接收回调函数,然后将接收任务委派给库。从逻辑或设计角度,您不轮询:您的函数被“立即”调用(它不是实时的,但它应该真的小于30秒)。
至于监控:我不会只依赖日志消息。要检查通信渠道,我建议向您的消息监听器发送“ping”请求。它可以通过在另一个队列上发送“pong”消息来响应(专门用于监视)。连同队列中当前的等待消息数以及ping / pong往返时间,监控系统可以决定是否应该查看操作。