У меня небольшая проблема с 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 в своем коде.