我想对activeMQ中的某个队列的消费者进行限制,在hornetq中(jboss,这是对mdb Consumer定义的注释)。我在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
}
}
答案 0 :(得分:7)
这取决于所使用的消费者技术......但这里有几个选项
您可以手动在消费者代码中引入延迟(不是精确的科学,但这会限制吞吐量)
您还可以通过设置JMS连接的maxConcurrentConsumers属性来控制消费者使用的线程数...这就是说,这不会限制消息吞吐量,只是限制您使用的并发级别消费者
更好的是,您可以使用限制器EIP实现设置每个时间段消耗的确切消息数
例如,使用Camel Throttler
这是微不足道的 from("activemq:queueA").throttle(10).to("activemq:queueB")
答案 1 :(得分:3)
使用ActiveMQ,您可以设置消费者预取限制:http://activemq.apache.org/what-is-the-prefetch-limit-for.html
要对其进行配置,您可以使用连接URL(大多数配置可以使用URL完成)或Java API。
有关更有趣的参数:http://activemq.apache.org/connection-configuration-uri.html
答案 2 :(得分:1)
考虑到Camel Throttler在被Throttler阻止时将内存交换保留在内存中。因此,如果您有100个队列使用者并且服务器(暴露SOAP服务)很慢,那么您可能在内存中最多可以有100个交换!
为此发表此问题:Throttle consumption rate of all JMS consumers listening on an ActiveMQ queue