Я пытаюсь настроить ActiveMQ для использования ограничений памяти и управления потоком производителя, чтобы не видеть поведение зависания, которое можно увидеть, когда вы пытаетесь отправить сообщение, когда не хватает памяти. Я следил за документацией на странице Producer Flow Control, Мои блоки производителей и 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>
И затем в одном из моих методов инициализации кода я установил следующее:
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 для ограничения использования памяти.