ActiveMQ的消费节流(ActiveMQ throttling consumer)

2019-07-18 01:59发布

我希望做一个限制在ActiveMQ的一些队列的消费者,在hornetq(JBoss的,这是在MDB消费者的定义注释做)。 我无法找到的ActiveMQ文档中的任何类似的,我找到最接近的是这样的

consumer.recvDelay   0 ms    Pause consumer for recvDelay milliseconds with each message (allows consumer throttling).

来自: http://activemq.apache.org/activemq-performance-module-users-manual.html

但是,我找不到我怎么可以在java中做到这一点。

提前致谢,

问候。

编辑:这是ActiveMQManager代码和消费者的代码:

public class ActiveMQManager {

    private static ActiveMQConnectionFactory CONNECTION_FACTORY;

    public static Connection CONNECTION;

    public static Session SESSION;

    public static Destination TEST_QUEUE;

    public static void start() {
        try {

            CONNECTION_FACTORY = new ActiveMQConnectionFactory("vm://localhost");

            CONNECTION = CONNECTION_FACTORY.createConnection();
            CONNECTION.start();

            SESSION = CONNECTION.createSession(false,
                    Session.CLIENT_ACKNOWLEDGE);

            TestClient testClient = new TestClient();

            TEST_QUEUE = SESSION.createQueue("TEST.QUEUE");

            MessageConsumer testConsumer = SESSION.createConsumer(TEST_QUEUE);
            test.setMessageListener(testClient);

        } catch (Exception e) {
        }
    }

    public static void stop() {
        try {
            // Clean up
            SESSION.close();
            CONNECTION.close();
        } catch (JMSException e) {
            log.error(e);
        }
    }
}

消费者的代码是(在这个例子中)很简单:

public class TestConsumer implements MessageListener {

    @Override
    public void onMessage(Message message) {
        //Do something with the message
    }

}

Answer 1:

这取决于消费者的技术使用......但这里有几个选项

  • 您可以手动介绍你的消费者的代码延迟(不是一门精确的科学,但是这将限制吞吐量)

  • 你还可以控制你的消费者使用通过设置maxConcurrentConsumers财产你JMS连接线程数...这么说,这不会油门消息吞吐量,只是限制并发水平正在使用你的消费者

  • 更好的是,你可以设置消息的确切数目使用节流EIP实现每个时间段消耗

    例如,这是微不足道的使用骆驼节流

    from("activemq:queueA").throttle(10).to("activemq:queueB")



Answer 2:

和ActiveMQ可以设置消费预取限制: http://activemq.apache.org/what-is-the-prefetch-limit-for.html

要对其进行配置,可以使用连接URL或Java API(大部分配置都可以使用URL来完成)。

更有趣的参数: http://activemq.apache.org/connection-configuration-uri.html



Answer 3:

考虑到骆驼节流保持交流的内存,而他们被堵塞节流。 所以,如果你有100名队列消费者和服务器(露出SOAP服务)是缓慢的,你可能有内存高达100个交流!

发布此这样一个问题: 所有的JMS消费者监听的ActiveMQ的队列油门消耗率



文章来源: ActiveMQ throttling consumer
标签: java activemq