0

在我的场景中,我有一个 boroker、一个生产者、一个消费者。我正在使用 activemq 来编写我的应用程序。记录到数据库。正如你所知,将日志写入数据库是一个耗时的过程。这就是为什么消费者比生产者越来越慢的原因。例如。我发送了 100.000 条消息(巨大的对象)。生产者在 20 分钟内完成发送消息。但是当生产者完成时,消费者已经完成了 4.000 条消息处理。

我的问题是;有什么办法可以说 procuder“如果代理中有 x 条消息等待消费,请稍等片刻后再尝试发送”

如何解决这个问题。

4

2 回答 2

1

使用像 ActiveMQ 这样的中间件背后的想法是随着时间的推移分离消息的生产和消费。例如,如果消费系统关闭,您的生产者不应该关心 - 它只关心消息是否进入队列。一旦出现,ActiveMQ 将在稍后的时间点传递这些消息。

如果您无法足够快地使用消息,则最好增加消费者数量或在收到消息后加快处理速度。

于 2013-09-19T08:14:14.973 回答
1

有几种方法可以监控 ActiveMQ

例如,您可以使用Advisory-Messages。有一些指标可用,如

ActiveMQ.Advisory.SlowConsumer.Queue
ActiveMQ.Advisory.FastProducer.Topic

等等

要准确了解每个 JMX 的队列大小,请阅读 http://activemq.apache.org/how-do-i-find-the-size-of-a-queue.html

并尝试例如类似于我的代码片段的东西:

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://<server>:<port>/jmxrmi");
JMXConnector jmxConnector = JMXConnectorFactory.connect(url);
...
try
{
  jmxConnector.connect();
  MBeanServerConnection connection = jmxConnector.getMBeanServerConnection();
...
  BrokerViewMBean brokerBean = MBeanServerInvocationHandler.newProxyInstance(connection, brokerBeanName, BrokerViewMBean.class, true);
  System.out.println("Total message count:" + brokerBean.getTotalMessageCount());
...
}
...

如果您监控 QueueSize/TotalMessageCount,您可以对此做出反应。

于 2013-09-18T11:11:28.723 回答