Производительность производителя jms с помощью spring

Я создал простую симуляцию производителя-потребителя на основе spring, jms и activemq, я пытаюсь достичь высокой производительности с обеих сторон, производителей и потребителей,

Настройки подключения:

<tx:annotation-driven />
<bean id="transactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
     <property name="connectionFactory"  ref="connectionFactory" />
</bean>

<amq:connectionFactory id="amqConnectionFactory" brokerURL="failover:(tcp://${broker.url}:61616)"  />

<bean id="connectionFactory"
    class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory" ref="amqConnectionFactory" />
</bean>

<amq:queue id="queue" physicalName="queue" />

<beans:bean id="jsonMessageConverter" class="XXXXX.converter.JsonMessageConverter" />

Настройки потребителя:

<jms:listener-container concurrency="10"
    acknowledge="auto" prefetch="1" message-converter="jsonMessageConverter" transaction-manager="transactionManager"

    >
    <jms:listener id="queueListener_1" destination="ooIntegrationQueue"
        ref="myMessageListenerAdapter" />
</jms:listener-container>


<beans:bean id="myMessageListenerAdapter"
    class="org.springframework.jms.listener.adapter.MessageListenerAdapter" >
    <beans:property name="delegate" ref="consumer"/>
</beans:bean>


<beans:bean id="consumer" class="XXX.ConsumerImpl"/>

Настройки производителя:

<beans:bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"
    p:connectionFactory-ref="connectionFactory" p:messageConverter-ref="jsonMessageConverter"
    p:defaultDestination-ref="ooIntegrationQueue" p:sessionTransacted="true" />

, начиная с потребителя, мне удалось получить около 25 сообщений на во-вторых, что очень медленно, я обнаружил, что узким местом является то, что я использую транзакции, немного погуглив и поигравшись с конфигами, я обнаружил, что после автоматического подключения DefaultMessageListenerContainer и изменения уровня кеширования на

listenerContainer.setCacheLevelName("CACHE_SESSION") 

моя производительность увеличивается примерно до 1500 сообщений в секунду при сохранении транзакций.

теперь моя проблема связана с производитель, который все еще застрял на скорости около 25 операций в секунду, мой тест продюсера прост:

int numOfMessages = getNumberOfMessages();


double startTime = System.currentTimeMillis();

for (int i = 1; i <= numOfMessages; i++) {
    jmsTemplate.convertAndSend("HelloWorld" + i);
}

double endTime = System.currentTimeMillis();

double totalTime=(endTime-startTime)/1000;
System.out.println("Time - "+totalTime+" seconds");
System.out.println("EPS - "+numOfMessages/totalTime);

Мне интересно, как достичь аналогичных показателей с продюсером, поскольку теперь он создает узкие места для всей системы.

23
задан skaffman 15 August 2011 в 09:31
поделиться