我对JAX-WS有一点问题。我正在使用ActiveMQ作为MOM和Spring。 消息传递非常简单:一个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 p:maxConcurrentConsumers的价值)。我认为问题在于,每次发送消息时,都会创建一个新的消费者,但永远不会被破坏。因此,在40条消息之后,不能创建新的消费者并且消息传递停止工作。我必须重新启动完整的消息。 我只能使用声明方式来解决这个问题,我从来没有在我的代码中从jms中调用任何东西。 有人有解决方案吗?这真的很紧急,我希望有人可以帮助我: - )
答案 0 :(得分:0)
默认情况下,CachingConnectionFactory将缓存消息使用者和生产者。您可以通过将cacheConsumers和cacheProducers属性设置为&#39; false&#39;来禁用它。
即。对于你的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为我解决了这个问题。
此外,请阅读Caching和Single连接工厂上的Spring API,以确保您使用正确的方案 - 他们提到了所有这些。