2

サブスクライバーが存在しない ActiveMQ ブローカーのキューにメッセージを追加すると、キューがいっぱいになり、最終的にプロデューサー スレッドがハングして、それ以上メッセージを発行できなくなります。

問題を解決するために、メッセージに有効期限を設定しました。これによりメモリが解放されると考えましたが、残念ながらこれは機能しません。問題を解決する方法を知っている人はいますか?

私のブローカー ActiveMQ のバージョンは 5.7 で、ブローカーの定義は次のとおりです。

<bean id="mqBroker" class="org.apache.activemq.broker.BrokerService" init-method="start" destroy-method="stop">
    <property name="brokerName" value = "mainBroker"/>
    <property name="persistent" value="false"/>
    <property name="useJmx" value="false"/>
    <property name="transportConnectorURIs">
        <list>
            <value>tcp://localhost:7000</value>
        </list>
    </property>
</bean>

ブローカーにこれ以上メッセージを発行できない場合に JConsole を見ると、メモリ使用量は良好 (0% の使用率) であり、有効期限切れカウント = 発行済みカウントです。

メッセージを公開するために使用しているコードは、Spring 統合を使用しています。

<jms:outbound-channel-adapter
    channel="jsonChannel"
    connection-factory="jmsConnectionFactory"
    pub-sub-domain="false"
    destination-name="MY_QUEUE"
    time-to-live="60000"
    wxplicit-qos-enabled="true" />
4

2 に答える 2

3

Broker は定期的にキューをスイープして、期限切れのメッセージを破棄します。問題は、期限切れのメッセージに何が起こっているかです。あなたが持っている設定を考えると、それらはおそらく DLQ になってしまうので、期限切れのメッセージを DLQ に追加しないように破棄ポリシーを設定することを検討したいかもしれません。この問題については、ActiveMQ のドキュメントを参照してください。

于 2013-10-02T18:01:41.863 に答える
0

しましたか

  • または_ message.setJMSExpiration(...);_javax.jms.Message
  • 「time to live」プロパティを設定します (これはトピック発行用に設計されていますが、特別な場合にはキューにも使用できます)

?

于 2013-10-02T15:40:32.400 に答える