2016-09-16 86 views
0

我正在開發一個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」是什麼,以及這種方法需要考慮什麼缺點?

我期待着什麼你們都在這一個說......

回答

0

我在春天的知識是有限的。但是通過閱讀你的描述,我相信春天做以下每次用於接收消息:

1)創建於IBM MQ隊列管理器的連接

2)打開指定的隊列

3)獲取從隊列

4)關閉關閉連接隊列

5)消息。

由於上述所有操作,接收單個消息所用的時間更多。但是,當會話被緩存時,Spring將重新使用緩存連接。因此消息接收吞吐量更好。

相關問題