2014-10-19 64 views
1

上下文: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)。有沒有從配置中丟失的東西,使它做到這一點?

+0

你的'jmsConnectionFactory'看起來像什麼? – 2014-10-20 15:11:12

+0

@StéphaneNic​​oll這裏是: wishihadabettername 2014-10-20 17:14:55

+0

I在這裏沒有看到任何明顯的錯誤。你能分享一個重現問題的項目嗎? – 2014-10-21 11:55:48

回答

2

我試圖使用通用JMS RA時偶然發現了同樣的問題。 最終如何正確工作的原因是在偵聽器容器上配置緩存級別,將其設置爲"NONE",以避免在現有連接上創建新會話。

添加緩存=「無」JMS:監聽器容器應該爲你的配置做的伎倆。

+1

或者如果您使用的是java配置而不是XML,則可以在DefultMessageListnerContainer的實例上調用此方法:'setCacheLevel(DefaultMessageListenerContainer.CACHE_NONE)' – ToeBee 2015-08-28 23:56:43