メモリ制限とプロデューサーフロー制御を使用するようにActiveMQを設定しようとしています。これにより、メモリが不足しているときにメッセージを送信しようとしたときに見られるハング動作が表示されなくなります。私はプロデューサーフロー制御、私のプロデューサーブロック、および接続構成URIのドキュメントに従いましたが、運が悪かったです。
私が遭遇している問題は、これらの設定が実際には適切に尊重されていないように見えることです。
私のActiveMQブローカーは私のSpring構成でそのように設定されています(私はこれをわずかにサニタイズしたので、100%有効なSpring構成ではない可能性があります):
<bean id="broker" class="org.apache.activemq.broker.BrokerService"
init-method="start">
<property name="brokerName" value="broker" />
<property name="persistent" value="false" />
<property name="useJmx" value="true" />
<property name="managementContext" ref="mgmtContext" />
<property name="transportConnectorURIs">
<list>
tcp://localhost:1234?jms.prefetchPolicy.queuePrefetch=0&jms.useAsyncSend=false&jms.alwaysSyncSend=true
</list>
</property>
<property name="destinations">
<list>
<bean class="org.apache.activemq.command.ActiveMQQueue">
<property name="physicalName" value="requests"></property>
</bean>
<bean class="org.apache.activemq.command.ActiveMQQueue">
<property name="physicalName" value="responses"></property>
</bean>
</list>
</property>
</bean>
そして、私のコードのinitメソッドの1つで、次のように設定します。
broker.getSystemUsage().setSendFailIfNoSpace(true);
broker.getSystemUsage().setSendFailIfNoSpaceAfterTimeout(5000);
// Limit memory usage to 10MB
broker.getSystemUsage().getMemoryUsage().setLimit(10 * 1024 * 1024);
それでも、コードを実行すると、ログに次のようなものが表示されます。
2013-Mar-14 14:47:31.538 GMT-06:00 DEBUG [ActiveMQ Transport: tcp:///127.0.0.1:45846@18086] [org.apache.activemq.usage.Usage:fireEvent] [Usage.java:245] [] [] [] - Main:memory: usage change from: 5640% of available memory, to: 0% of available memory
そのため、ActiveMQは、設定されたメモリ制限を露骨に無視しているように見えます。
十分に大きなメッセージをキューに入れるとブロック動作が発生する可能性があり、非常に大きなメッセージをキューに入れるとOOMエラーが発生することもあります。
メモリ使用量を制限するようにActiveMQを確実に構成するにはどうすればよいですか。