0

私のシナリオでは、ボロカーが 1 人、プロデューサーが 1 人、コンシューマーが 1 人います。アプリの作成に activemq を使用しています。db へのログ。ログを db に書き込むのは時間がかかるプロセスであることを知っているため、コンシューマーはプロデューサーよりもますます遅くなります。100.000 メッセージ (巨大なオブジェクト) を送信します。プロデューサーは 20 分でメッセージの送信を終了します。しかし、プロデューサーが終了すると、コンシューマーはまだ 4.000 メッセージの処理を終了しています。

私の質問は; プロデューサーが「消費を待っているメッセージがブローカーにある場合は待機し、しばらくしてから送信してください」と言う方法はありますか?

どうすればこの問題を解決できますか。

4

2 に答える 2

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 に答える
1

ActiveMQ のようなミドルウェアを使用する背後にある考え方は、時間の経過とともにメッセージの生成と消費を分離することです。たとえば、コンシューマー システムがダウンしている場合、プロデューサーは気にする必要はありません。プロデューサーが気にするのは、メッセージがキューに入ったということだけです。そこに到達すると、ActiveMQ は後でこれらのメッセージを配信します。

メッセージを十分に速く消費できない場合は、コンシューマーの数を増やすか、受信したメッセージの処理を高速化する方がはるかに良いでしょう。

于 2013-09-19T08:14:14.973 に答える