2012-05-02 22 views
1

私はspring-jms-3.0.6.RELEASEを使用してMQを開きます。以下の例外が発生する理由についてのアイデアはありますか?Open JMSを使用した場合のSpring JMSセッションの問題

2012-05-02 17:56:18,420 [stuJmsContainer-803059] WARN 
org.springframework.jms.listener.DefaultMessageListenerContainer - Setup of JMS message listener invoker failed for destination 

'TestQ' - trying to recover. Cause: 
MQRA:CA:createSession failed-Only one JMS Session allowed when managed connection is involved in a transaction 

のweb.xml:

<context-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value> 
        classpath:/spring/testlistener-context-api.xml 
        classpath:/spring/testmsg-context-api.xml 
      </param-value> 
     </context-param> 
<listener> 
     <listener-class>org.jboss.resteasy.plugins.spring.SpringContextLoaderListener</listener-class> 
</listener> 
<listener> 
     <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
</listener> 
<listener> 
     <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 

testlistener-コンテキストapi.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/util 
    http://www.springframework.org/schema/util/spring-util-3.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> 

    <tx:annotation-driven /> 

    <bean id="testListener" class="com.test.TestListener" /> 

    <bean id="executionInterceptor" class="com.test.ExecutionInterceptor" /> 

    <bean id="testJmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
     <property name="connectionFactory" ref="jmsQueueConnectionFactory"/> 
     <property name="destinationName" value="TestQ"/> 
     <property name="sessionTransacted" value="false"/> 
     <property name="messageListener" ref="stuMessageListener" /> 
     <property name="concurrentConsumers" value="5" /> 
     <property name="maxConcurrentConsumers" value="100" /> 
     <property name="receiveTimeout" value="30000" /> 
    </bean> 
</beans> 

testmsg-コンテキストapi.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/util 
    http://www.springframework.org/schema/util/spring-util-3.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> 

    <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate"/> 

    <bean id="jmsQueueConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiTemplate"> 
      <ref bean="jndiTemplate"/> 
     </property> 
     <property name="jndiName" value="${jms.jndi.qconnectionfactory}"> 

     </property> 
    </bean> 
    <bean id="jmsTopicConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiTemplate"> 
      <ref bean="jndiTemplate"/> 
     </property> 
     <property name="jndiName" value="${jms.jndi.tconnectionfactory}"> 

     </property> 
    </bean> 
    <bean id="myJMSConnectionFactory" class="com.test.OpenMqConnectionFactoryBean"> 
     <property name="imqAddressList" value="${jms.imq.url}" /> 
     <property name="imqDefaultUsername" value="${jms.imq.user}" /> 
     <property name="imqDefaultPassword" value="${jms.imq.password}" /> 
     <property name="imqHost" value="${jms.imq.host}" /> 
     <property name="imqPort" value="${jms.imq.port}" /> 
    </bean> 
    <bean id="jmsTopicTemplate" class="com.test.CustomJMSTemplate"> 
     <property name="connectionFactory" ref="jmsTopicConnectionFactory" /> 
     <property name="connectionFactoryName" value="${jms.jndi.tconnectionfactory}"/> 
     <property name="pubSubDomain" value="true" /> 
    </bean> 
    <bean id="jmsTemplate" class="com.test.CustomJMSTemplate"> 
     <property name="connectionFactory" ref="jmsQueueConnectionFactory" /> 
     <property name="connectionFactoryName" value="${jms.jndi.qconnectionfactory}"/> 
    </bean> 

    <tx:annotation-driven /> 
</beans> 
+0

JmsContainerの設定は可能ですか? – Nicholas

+0

@Nicholas - Spring JMS設定を追加しました。探していたものですか? – c12

+0

Collat​​ing ... – Nicholas

答えて

1

ConnectionAdapter source codeとこのアーカイブスレッドOpenMQ mailing listによると、Springまたはコード自体は、単一のJMS接続で複数のセッションを作成します。

このOpenMQの動作(エラーを発生させる)は、システムプロパティimq.jmsra.inACCfalseに設定することで無効にすることはできますが、満足できるものではありません。

トランザクションマネージャを使用しない場合、Springはorg.springframework.jms.connection.SingleConnectionFactoryを使用して、複数のコンシューマに対して1つの接続を共有します。

DefaultMessageListenerContainer cacheLevelNameプロパティをCACHE_NONEに設定して、各コンシューマスレッドが1回の接続で独自のセッションを取得するようにする必要があります。

+0

問題を解決してくれたように御礼をありがとう。私はトランザクションマネージャを使用していないので、cacheLevelNameはCACHE_NONEのデフォルト値を使用しません。 – c12

+0

はい:http://grepcode.com/file/repository.springsource.com/org.springframework/org.springframework.jms/3.0.7/org/springframework/jms/listener/DefaultMessageListenerContainer.java#DefaultMessageListenerContainer.initialize% 28%29 –

+0

をCACHE_NONEにスワップして、それぞれ独自のスレッドに与えると、別の例外が発生します。WARN org.springframework.jms.listener.DefaultMessageListenerContainer - JMSメッセージ・リスナーの呼び出し側のセットアップが、宛先 'TestQ'で失敗してリカバリしようとしました。原因:MQRA:CFA:allocation failure:createConnection:接続の割り当て中にエラーが発生しました。原因:使用中の接続は、max-pool-sizeと期限切れの最大待機時間に等しくなります。より多くの接続を割り当てることができません。何か案は? – c12

関連する問題