JAX-WS:连接不会关闭 - 在x消息后停止消息传递

时间:2012-11-28 16:47:50

标签: java spring jms activemq messaging

我对JAX-WS有一点问题。我正在使用ActiveMQ作为MOM和Spring。 消息传递非常简单:一个ja​​r应该发送带有一些数据的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中调用任何东西。 有人有解决方案吗?这真的很紧急,我希望有人可以帮助我: - )

1 个答案:

答案 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,以确保您使用正确的方案 - 他们提到了所有这些。