我正在開發一個JMS密集型應用程序,它發送/接收數以十萬計的消息。我發現性能並不是那麼好,並且將問題縮小到如下所示的1行,根據我可以說的根本原因,它與IBM MQ無法很好地協作。ibm.mq.jms.MQQueueConnectionFactory Spring JMSTemplate
JMSTemplate.receive(queueName);
在一個簡單的定時器包裝此代碼後,我發現,在接收來自任何地方20-50毫秒,由於我負責的,一定會增加隨着時間的推移吞吐量的絕對量服用。經過一番搜索之後,我偶然發現了「CachingConnectionFactory」這個彈簧,我用下面的運氣實現了它(不知道這是否適用於我已經使用的IBM MQ Connection工廠)。請注意,某些代碼被省略的可讀性...
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
...
</bean>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory">
<ref bean="cacheFactory" />
</property>
...
</bean>
<!--This seems to be the magic piece-->
<bean id="cacheFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="ibmMQConnectionFactory" />
<property name="sessionCacheSize" value="100" />
</bean>
<bean id="ibmMQConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
...
</bean>
令我驚訝的是,這減少了我的JMSTemplate.receive()20-50 +毫秒之間的任何地方調用每封郵件約1-2米利斯。我無法找到任何關於這在幕後工作的可靠信息,以及「sessionCacheSize」如何影響性能。我第一次測試的時候是50的值,第二次測試的時候是100,第二種測試的時候速度要快得多。所以我的問題是,對於具有大量吞吐量的應用程序,理想的「sessionCacheSize」是什麼,以及這種方法需要考慮什麼缺點?
我期待着什麼你們都在這一個說......