【问题标题】:Spring JMS DefaultMessageListenerContainer Polling frequencySpring JMS DefaultMessageListenerContainer 轮询频率
【发布时间】:2021-04-01 10:06:30
【问题描述】:

我正在使用 DefaultMessageListenerContainer 来使用来自 ActiveMQ 队列的消息,如下所示。使用此实现是否有任何轮询机制,侦听器是否每隔 1 秒左右轮询队列以查看是否有新消息,或者每当队列中有新消息时调用 onMessage 方法?如果它使用轮询,我们如何增加或减少轮询频率(时间)。

DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setMessageListener(new MessageJmsListener ());

public class MessageJmsListener implements MessageListener {
    
  @Override
    public void onMessage(Message message) {
        if (message instanceof TextMessage) {
            try {
                //process the message and create record in Data Base                
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }     
}

【问题讨论】:

    标签: jms activemq spring-jms polling message-listener


    【解决方案1】:

    容器轮询 JMS 客户端,但代理向客户端推送消息。

    所以,不,容器不会直接轮询队列。

    如果队列中没有消息,容器会在receiveTimeout之后超时并立即重新轮询,并在broker发送后立即获取下一条消息。

    预取决定了broker向消费者发送了多少条消息;所以这可能会影响性能(但我认为,最近的 ActiveMQ 版本默认为 1000)。

    将预取设置为 1 将使您的交付速度最慢。

    如果您想放慢速度,可以在侦听器中添加Thread.sleep()

    【讨论】:

    • 谢谢。你能指点我这方面的任何文件吗?我找不到太多细节。
    • 我看到你是新来的 - 请参阅 stackoverflow.com/help/someone-answers - 请参阅 javadocsreference 以及代码本身(毕竟它是开源的)。
    • 我是新来的。请说清楚。如上所述使用带有 MessageListener 的异步接收时,recievTimeOut 是否不适用。 docs.spring.io/spring-framework/docs/3.0.x/… 21.4.1 同步接收 .. 可以同步消费消息。在同步接收期间,调用线程会阻​​塞,直到消息可用。这可能是一个危险的操作,因为调用线程可能会被无限期地阻塞。属性 receiveTimeout 指定接收者在放弃等待消息之前应该等待多长时间。
    • 请不要使用 3.0.x 文档;当前的 spring 版本是 5.3.x spring.io/projects/spring-framework#learn 3.0.x 已经多年不支持了。对于异步,容器的receiveTimeout 对传输率几乎没有影响,当接收超时时,容器会立即尝试另一个接收。启用 DEBUG 日志记录时,增加 receiveTimeout 可能有助于减少日志记录量。增加太多也会使容器对stop() 调用的响应降低,因为在接收超时之前停止不会生效。
    猜你喜欢
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    相关资源
    最近更新 更多