Hello,

I am trying to setup activemq 5.4.2 and I experience hangs when the broker fills its heap and starts using storage. In my scenario I have one message producer and one message consumer connected. The producer is blocked and the consumer does not receive any messages. I have been able to run the broker under debug mode and identify what the relevant threads are doing:

The task for iteration of the queue waits for the messagesLock on the line 1404 in http://svn.apache.org/viewvc/activemq/tags/activemq-5.4.2/activemq-core/src/main/java/org/apache/activemq/broker/region/Queue.java?view=markup.

The thread that stores messages into the queue waits on the line 219 of http://svn.apache.org/viewvc/activemq/tags/activemq-5.4.2/activemq-core/src/main/java/org/apache/activemq/broker/region/cursors/FilePendingMessageCursor.java?view=markup for free space. Note that the thread has the messagesLock locked and the temporaly usage is always 103%, and therefore, it never returns.

Is it possible that I encountered something like a deadlock? Perhaps, I messed up something in the configuration.

I will be thankful for advice.
Tomas

Here is the configuration of the broker:

<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";>

<!-- Allows us to use system properties as variables in this configuration file --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" />

    <!--
        The <broker> element is used to configure the ActiveMQ broker.

advisories incurr a hit with every add connection|destination|producer|consumer - client side: providerUrl = tcp://localhost:61616?jms.watchTopicAdvisories=false
        statistics have a small impact on concurrency so disable
schedualer has a small impact as it checks for the presence three properties on each message
        jmx adds a bunch of wrapper classes

ACTIVEMQ_OPTS_MEMORY="-Xmx11g -Xms6g -Dorg.apache.activemq.UseDedicatedTaskRunner=false -Djava.util.logging.config.file=logging.properties -XX:+UseLargePages"
    -->
<broker xmlns="http://activemq.apache.org/schema/core"; brokerName="localhost"
        dataDirectory="/dasd/martinec/kahadb-storage/activemq-data"
        destroyApplicationContextOnStop="true"
        deleteAllMessagesOnStartup="true"
        advisorySupport="false"
        enableStatistics="false"
        schedulerSupport="false"
        useJmx="true"
        persistent="true">

        <destinationPolicy>
            <policyMap>
              <policyEntries>
                <!--
producerFlowControll thread unnecessary with no memory limits with no failover, no need to suppress duplicates so audit can be disabled message expiry thread unnecessary as normal dispatch will handle expiry
                -->
<policyEntry topic=">" producerFlowControl="false" enableAudit="false" expireMessagesPeriod="0"></policyEntry> <policyEntry queue=">" producerFlowControl="true" memoryLimit="50mb" enableAudit="false" expireMessagesPeriod="0">

                </policyEntry>
              </policyEntries>
            </policyMap>
        </destinationPolicy>

        <!--
The managementContext is used to configure how ActiveMQ is exposed in JMX. By default, ActiveMQ uses the MBean server that is started by
            the JVM. For more information, see:

            http://activemq.apache.org/jmx.html
        -->
        <managementContext>
<managementContext createConnector="true" connectorPort="1399" rmiServerPort="1399"/>
        </managementContext>

        <persistenceAdapter>
            <kahaPersistenceAdapter directory="/dasd/martinec/kahadb-storage"/>
        </persistenceAdapter>

        <systemUsage>
            <systemUsage>
                <memoryUsage>
                    <!-- the only queue has 50 mb, so this should be enough -->
                    <memoryUsage limit="200 mb"/>
                </memoryUsage>
                <storeUsage>
                    <!-- no special reason for this -->
                    <storeUsage limit="1 gb"/>
                </storeUsage>
                <tempUsage>
                    <!-- this MUST be above the journal file size; see
http://tmielke.blogspot.cz/2011/02/observations-on-activemqs-temp-storage.html
                     -->
                    <tempUsage limit="100 mb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>

        <!--
The transport connectors expose ActiveMQ over a given protocol to
            clients and other brokers. For more information, see:

            http://activemq.apache.org/configuring-transports.html
        -->
        <transportConnectors>
            <transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/>
        </transportConnectors>
    </broker>

    <import resource="jetty.xml"/>

</beans>

Reply via email to