jms - Spring/HornetQ: HQ154002: Could not create session: Only allowed one session per connection -
jms - Spring/HornetQ: HQ154002: Could not create session: Only allowed one session per connection -
context: spring 4.0.6 app running within jboss eap 6.2. part of application jms queue , on receiving side, messages need processed in parallel, otherwise many messages take long.
spring's jms listener configured concurrency of 10 , delegates executor pool 10 threads (first question: relationship correct?)
<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>
under load, next error appears frequently:
10:32:47,457 error [org.hornetq.ra] (org.springframework.jms.listener.defaultmessagelistenercontainer#0-112) hq154002: not create session: javax.jms.illegalstateexception: allowed 1 session per connection. see j2ee spec, e.g. j2ee1.4 section 6.6 @ org.hornetq.ra.hornetqrasessionfactoryimpl.allocateconnection(hornetqrasessionfactoryimpl.java:811) @ org.hornetq.ra.hornetqrasessionfactoryimpl.createsession(hornetqrasessionfactoryimpl.java:465) @ org.springframework.jms.support.jmsaccessor.createsession(jmsaccessor.java:197) [spring-jms-4.0.6.release.jar:4.0.6.release] @ org.springframework.jms.listener.defaultmessagelistenercontainer.access$1400(defaultmessagelistenercontainer.java:119) [spring-jms-4.0.6.release.jar:4.0.6.release] @ org.springframework.jms.listener.defaultmessagelistenercontainer$asyncmessagelistenerinvoker.initresourcesifnecessary(defaultmessagelistenercontainer.java:1122) [spring-jms-4.0.6.release.jar:4.0.6.release] @ org.springframework.jms.listener.defaultmessagelistenercontainer$asyncmessagelistenerinvoker.invokelistener(defaultmessagelistenercontainer.java:1101) [spring-jms-4.0.6.release.jar:4.0.6.release] @ org.springframework.jms.listener.defaultmessagelistenercontainer$asyncmessagelistenerinvoker.executeongoingloop(defaultmessagelistenercontainer.java:1094) [spring-jms-4.0.6.release.jar:4.0.6.release] @ org.springframework.jms.listener.defaultmessagelistenercontainer$asyncmessagelistenerinvoker.run(defaultmessagelistenercontainer.java:991) [spring-jms-4.0.6.release.jar:4.0.6.release] @ java.lang.thread.run(thread.java:745) [rt.jar:1.7.0_60]
now, understand jms spec prohibits that. it's not clear how spring gets in position nail limitation. particularly, checked defaultmesagelistenercontainer source has next fragment:
1120 if (this.session == null && getcachelevel() >= cache_session) { 1121 updaterecoverymarker(); 1122 this.session = createsession(getsharedconnection()); 1123 }
so spring appears effort reuse connection (see line 1122). there missing configuration makes this?
i stumbled upon same issue while trying utilize generic jms ra. made work correctly in end configure cache level on listener container, setting "none", avoid creating new session on existing connection.
adding cache="none" jms:listener-container should trick configuration.
spring jms jboss7.x hornetq spring-jms
Comments
Post a Comment