我需要向/從單個JMS服務器上存儲的不同主題發送/接收消息。Spring JMS連接:性能考慮事項
我想使用JmsTemplate
發送和MessageListenerContainer
註冊異步監聽器。
我的配置是這樣的:
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">xxx</prop>
<prop key="java.naming.provider.url">yyy</prop>
</props>
</property>
</bean>
<bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate" ref ="jndiTemplate"/>
<property name="jndiName" value="TopicConnectionFactory"/>
</bean>
<bean id="singleConnectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<constructor-arg ref="connectionFactory"/>
</bean>
<bean id="tosJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="singleConnectionFactory"/>
<property name="destinationResolver" ref="destinationResolver"/>
<property name="pubSubDomain" value="true"/>
</bean>
據我瞭解,singleConnectionFactory
,總是返回相同的連接實例,有助於減少創建和每次關閉 連接的jmsTemplate
需要的開銷(例如)發送/接收消息(如使用正常的ConnectionFactory
時那樣)。
我的第一個問題是:如果我創建了多個jmsTemplate
(s),他們都可以共享一個參考singleConnectionFactory
?或者他們是否每個都需要接收一個不同的實例(singleConnectionFactory1
,singleConnectionFactory2
等)?
讀API爲SingleConnectionFactory
,我發現這一點:
需要注意的是春天的消息偵聽容器相互支持監聽器容器實例中使用的共享
Connection
。組合使用SingleConnectionFactory
只對跨多個偵聽器容器共享單個JMS連接確實有意義。
這聽起來有點神祕。據我所知,每個MessageListenerContainer
只能註冊1個Listener,所以我不明白連接共享的程度。
假設我想寄存器N聽衆:我需要重複N次這樣的事情:
<bean
class="org.springframework.jms.listener.SimpleMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destinationName" value="destX" />
<property name="messageListener" ref="listener1outOfN" />
</bean>
有多少個連接在這種情況下,從connectionFactory的創造?每個ListenerContainer或只有一個連接池?如果我提供SimpleMessageListenerContainer
-s的參考號碼singleConnectionFactory
?
在這種情況下,最好的方法是什麼(從演出的角度來看)?
嗨!謝謝回答!如果有裁判singleConnectionFactory創建SimpleMessageListenerContainer一樣,我得到以下異常: 「錯誤創建與名init方法的類路徑資源XXX調用定義‘org.springframework.jms.listener.SimpleMessageListenerContainer#0’失敗豆;嵌套的例外是不支持setExceptionListener呼叫代理共享連接設置在SingleConnectionFactory了「的ExceptionListener」屬性,而不是另外,....」 你知道,如果缺少的東西:org.springframework.jms.IllegalStateException。? – Federico