我有以下配置,它设置了一个"MessageReader"pojo类来处理传入的消息。这在配置时工作正常,但由于我对 Spring 集成没有太多经验,因此我对下面发生的事情以及是否可以监控它有一些基本问题。
- 我无法找到有关基础消息侦听器容器轮询队列以查找消息的频率的文档。我错过了什么吗? 如果我正确理解以下配置,它将默认使用"默认消息侦听器容器"。我看到该类扩展了AbstractPollingMessageListenerConainer。我看到接收超时,但没有看到任何指定轮询间隔的内容。有这样的设置吗?当我使用如下所示的配置进行测试时,它似乎非常即时。我们的需求并不那么强烈;我们可以每 30 秒左右轮询一次队列。
- 有没有办法(也许只是一个 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>
容器是消息驱动的 - 它总是在提供程序的客户端库中阻止一个或多个线程,等待新消息到达 - 它不是轮询队列,而是轮询客户端。接收超时(默认为 5 秒)只是为了让容器可以对 stop() 做出反应(否则线程将在客户端中被阻塞,无法中断它 - 取决于客户端的实现)。
如果打开 TRACE 调试,您将看到此活动 - 但请记住,这并不意味着每次都有往返代理的行程,它只是询问客户端是否已从代理到达新消息。
当容器创建使用者时,代理知道它并直接发送消息 - 队列本身没有轮询。
如果使用消息侦听器,则只需定义接收回调函数,然后将接收任务委托给库。从逻辑或设计的角度来看,你不是在轮询:你的函数被"立即"调用(它不是实时的,但它应该真正小于 30 秒)。
至于监控:我不会只依赖日志消息。为了检查通信渠道,我建议向您的消息侦听器发送"ping"请求。它可以通过在另一个队列(专门用于监视)上发送"pong"消息来响应。结合队列中当前等待消息的数量和乒乓球往返时间,监控系统可以决定是否应该查看操作。