Соединение JAX-WS не закрывается и прекращает обмен сообщениями после x сообщений

У меня небольшая проблема с JAX-WS. Я использую ActiveMQ как MOM и Spring. Обмен сообщениями очень прост: один jar должен отправить мыльное сообщение с некоторыми данными другому.

Я определил клиента таким образом в своем sender_beans.xml:

<bean id="jmsConfig-Manager" class="org.apache.cxf.transport.jms.JMSConfiguration"
    p:connectionFactory-ref="jmsConnectionFactory"
    p:targetDestination="activemq:example.manager"
    p:pubSubDomain="true" p:maxConcurrentConsumers="40" p:deliveryMode="1"
    p:explicitQosEnabled="true" p:reconnectOnException="true" />

<bean id="jmsConnectionFactory"
    class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="sessionCacheSize" value="40" />

    <property name="targetConnectionFactory">
        <bean class="org.apache.activemq.ActiveMQConnectionFactory">
            <property name="brokerURL"

                value="tcp://localhost:61616?jms.useAsyncSend=true" />
        </bean>
    </property>
</bean>

И это моя конечная точка:

<jaxws:endpoint id="ManagerService" implementor="#ManagerServ"
    implementorClass="com.example.Service"
    address="jms://">
    <jaxws:features>
        <bean class="org.apache.cxf.transport.jms.JMSConfigFeature"
            p:jmsConfig-ref="jmsConfig-Manager" />
    </jaxws:features>
</jaxws:endpoint>
<bean id="jmsConnectionFactory"
    class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="sessionCacheSize" value="40" />

    <property name="targetConnectionFactory">
        <bean class="org.apache.activemq.ActiveMQConnectionFactory">
            <property name="brokerURL"

                value="tcp://localhost:61616?jms.useAsyncSend=true" />
        </bean>
    </property>
</bean>

Итак, обмен сообщениями работает, но только 40 раз! (Что является значением когда-либо p:maxConcurrentConsumers). Я думаю, проблема в том, что каждый раз, когда отправляется сообщение, создается новый потребитель, но никогда не уничтожается. Таким образом, после 40 сообщений новый потребитель не может быть создан, и обмен сообщениями перестает работать. Я должен перезапустить полный обмен сообщениями.

Я могу использовать только декларативный способ решения этой проблемы, я никогда ничего не вызываю из jms в своем коде.


person Mirco    schedule 28.11.2012    source источник


Ответы (1)


CachingConnectionFactory по умолчанию кэширует потребителей и производителей сообщений. Вы можете отключить это, установив для свойств cacheConsumers и cacheProducers значение false.

т.е. для вашего Spring xml:

<bean id="jmsConnectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
   <property name="sessionCacheSize" value="40" />
   <property name="cacheConsumers" value="false" />
   <property name="targetConnectionFactory">
...

У меня была недавняя проблема, когда программно созданные потребители сообщений не уничтожались при вызове .close() для объекта-потребителя (я все еще мог видеть активных потребителей в консоли администратора ActiveMQ). cacheConsumers = false разрешил это для меня.

Кроме того, прочитайте Spring API на фабриках кэширования и одиночного соединения, чтобы убедиться, что вы используете правильный для своего сценария — они все это упоминают.

person shuttsy    schedule 06.12.2012