Details
-
Bug
-
Status: Resolved
-
Critical
-
Resolution: Fixed
-
5.3.1
-
None
-
SLES 11, IBM JDK 1.6
Description
How to reproduce:
- Download ActiveMQ 5.3.1
- Start broker with the attached configuration
—
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage limit="10 mb"/>
</memoryUsage>
<storeUsage>
<storeUsage limit="10 mb" name="queue/RemoteQ"/>
</storeUsage>
<tempUsage>
<tempUsage limit="3 gb"/>
</tempUsage>
</systemUsage>
</systemUsage>
— - Start example producer/consumer
cd examples
ant producer -Durl=tcp://127.0.0.1:61616 -Dmax=100000 -Dsubject=queue/RemoteQ -Ddurable=true -DsleepTime=2
sleep 600
ant consumer -Durl=tcp://127.0.0.1:61616 -Dsubject=queue/RemoteQ -Dmax=100000 -DsleepTime=2
The problem:
When the 10mb limit is reached, the producer is blocked forever.
The expected behavior is, that if a consumer cleans the queue, producers are able to post more messages.
Neither cleaning up the queue, restarting producers and restarting the broker helps
It would be also a good idea to enhance the documentation about producer-flow-control:
(http://activemq.apache.org/producer-flow-control.html)
- expected behavior
- what is limited in detail by using system|store|tempUsage
The entire configuration :
—
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:amq="http://activemq.apache.org/schema/core"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>file:${activemq.base}/conf/credentials.properties</value>
</property>
</bean>
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}/data" >
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic=">" producerFlowControl="true" memoryLimit="10mb">
<deadLetterStrategy>
<!--
Use the prefix 'DLQ.' for the destination name, and make
the DLQ a queue rather than a topic
-->
<individualDeadLetterStrategy
queuePrefix="DLQ." useQueueForQueueMessages="true" />
</deadLetterStrategy>
<pendingSubscriberPolicy>
<vmCursor />
</pendingSubscriberPolicy>
</policyEntry>
<policyEntry queue=">" producerFlowControl="true" memoryLimit="10mb">
<!-- Use VM cursor for better latency
For more information, see:
http://activemq.apache.org/message-cursors.html
<pendingQueuePolicy>
<vmQueueCursor/>
</pendingQueuePolicy>
-->
<deadLetterStrategy>
<!--
Use the prefix 'DLQ.' for the destination name, and make
the DLQ a queue rather than a topic
-->
<individualDeadLetterStrategy
queuePrefix="DLQ." useQueueForQueueMessages="true" />
</deadLetterStrategy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage limit="10 mb"/>
</memoryUsage>
<storeUsage>
<storeUsage limit="10 mb" name="queue/RemoteQ"/>
</storeUsage>
<tempUsage>
<tempUsage limit="3 gb"/>
</tempUsage>
</systemUsage>
</systemUsage>
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/>
</transportConnectors>
</broker>
<import resource="jetty.xml"/>
</beans>
—