Activemq降低响应时间

时间:2015-08-19 14:20:18

标签: spring performance jms activemq spring-jms

我在弹簧4.1.1中使用activemq 5.10。 我发现消息的响应时间有一个降级问题。 4天后,响应时间从15ms开始增长到200ms甚至更长。 该应用程序正常工作,每秒大约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 );
    }
}

公共类MyExecutor {

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);
    }   
}

1 个答案:

答案 0 :(得分:0)

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