Activemq 降低响应时间

Activemq degrade response time

我正在使用 activemq 5.10 和 spring 4.1.1。 我发现消息的响应时间存在降级问题。 4 天后,响应时间开始从 15 毫秒增加到 200 毫秒甚至更长。 该应用程序运行良好,每秒大约 1000 条消息,然后所有 运行 变慢。

这是 xml bean 的一部分:

<amq:systemUsage>
            <amq:memoryUsage>
                <amq:memoryUsage limit="512 mb">
                </amq:memoryUsage>
            </amq:memoryUsage>
            <amq:storeUsage>
                <amq:storeUsage limit="50 mb"></amq:storeUsage>
            </amq:storeUsage>
            <amq:tempUsage>
                <amq:tempUsage limit="50 mb"></amq:tempUsage>
            </amq:tempUsage>
    </amq:systemUsage>

    <amq:broker brokerName="myBroker" id="broker"
        persistent="false" deleteAllMessagesOnStartup="true" enableStatistics="false"
        useLoggingForShutdownErrors="true">

        <amq:transportConnectors>
            <amq:transportConnector
                uri="nio://${Ip}:${Port}?jms.useAsyncSend=true?jms.useCompression=true"
                disableAsyncDispatch="false" />
        </amq:transportConnectors>

        <amq:destinationPolicy>
            <amq:policyMap>
                <amq:policyEntries>
                    <amq:policyEntry queue=">" optimizedDispatch="true" />
                </amq:policyEntries>
            </amq:policyMap>    
        </amq:destinationPolicy>

    </amq:broker>

    <!-- A JMS connection factory for ActiveMQ -->
    <bean id="ConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"
        p:brokerURL="nio://${Ip}:${Port}" />


    <bean id="pooledJmsConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory"
        destroy-method="stop">
        <property name="connectionFactory" ref="ConnectionFactory" />
        <property name="maxConnections" value="10" />
    </bean> 
<bean id="Listener" class="xx.com.xxx.MessageListener" />
<jms:listener-container container-type="default"
            connection-factory="ConnectionFactory" acknowledge="auto">
            <jms:listener destination="${QueueName}"
                ref="sisBusMessageListener" method="onMessage" />
 </jms:listener-container>

这里是 Java 代码:

public class MessageListener extends GenericMessageListener {

    public void onMessage(Message request) {
        MyExecutor mythread = new MyExecutor(request, new DateTime());
        executor.execute(mythread );
    }
}

public class 我的执行器 {

public void init() {
    try {
        connectionFactory = ApplicationHelper.getBean("ConnectionFactory");
        connectionFactory.setAlwaysSessionAsync(false);
        connection = connectionFactory.createConnection();
        connection.start();

        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    } catch (JMSException e) {
        logs...
    }
}  

public void returnMessage(Message request, Object responseFromExternalSystem) throws JMSException {

    MapMessage response = session.createMapMessage();
    response.setJMSCorrelationID(request.getJMSCorrelationID());

    //code that set info on map message is here

    replyProducer = session.createProducer(request.getJMSReplyTo());
    replyProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
    replyProducer.send(response);
    }   
}

解决方案是重新使用连接和会话,仅创建一个实例并在某些情况下创建另一个实例(错误、断开连接...)