上下文:JBoss EAP 6.2中運行的Spring 4.0.6應用程序。部分應用程序是JMS隊列,在接收端,其消息需要並行處理,否則許多消息需要很長時間。Spring/HornetQ:HQ154002:無法創建會話:每個連接只允許一個會話
Spring的JMS偵聽器配置爲10的併發和代表與10個線程的執行池(第一個問題:是這種關係正確?)
<bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="10" />
<property name="queueCapacity" value="20" />
</bean>
<jms:listener-container destination-resolver="jndiDestinationResolver" destination-type="queue" acknowledge="auto" connection-factory="jmsConnectionFactory" concurrency="10" task-executor="executor">
<jms:listener destination="java:jboss/exported/jms/queue/myQueue" ref="myMessageHandler"/>
</jms:listener-container>
在負載下,下面的錯誤頻頻出現:
10:32:47,457 ERROR [org.hornetq.ra] (org.springframework.jms.listener.DefaultMessageListenerContainer#0-112) HQ154002: Could not create session: javax.jms.IllegalStateException: Only allowed one session per connection. See the J2EE spec, e.g. J2EE1.4 Section 6.6
at org.hornetq.ra.HornetQRASessionFactoryImpl.allocateConnection(HornetQRASessionFactoryImpl.java:811)
at org.hornetq.ra.HornetQRASessionFactoryImpl.createSession(HornetQRASessionFactoryImpl.java:465)
at org.springframework.jms.support.JmsAccessor.createSession(JmsAccessor.java:197) [spring-jms-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer.access$1400(DefaultMessageListenerContainer.java:119) [spring-jms-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.initResourcesIfNecessary(DefaultMessageListenerContainer.java:1122) [spring-jms-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1101) [spring-jms-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1094) [spring-jms-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:991) [spring-jms-4.0.6.RELEASE.jar:4.0.6.RELEASE]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_60]
現在,我明白了JMS規範禁止這一點。目前還不清楚Spring如何才能達到這個限度。特別是,我檢查它具有以下片段DefaultMesageListenerContainer source:
1120 if (this.session == null && getCacheLevel() >= CACHE_SESSION) {
1121 updateRecoveryMarker();
1122 this.session = createSession(getSharedConnection());
1123 }
所以春天似乎試圖重用連接(見行1122)。有沒有從配置中丟失的東西,使它做到這一點?
你的'jmsConnectionFactory'看起來像什麼? – 2014-10-20 15:11:12
@StéphaneNicoll這裏是: –
wishihadabettername
2014-10-20 17:14:55
I在這裏沒有看到任何明顯的錯誤。你能分享一個重現問題的項目嗎? – 2014-10-21 11:55:48