我对 JAX-WS 有一点问题。我使用 ActiveMQ 作为 MOM 和 Spring。消息传递非常简单:一个 jar 应该向另一个 jar 发送带有一些数据的 soap 消息。
我在 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 调用任何东西。