2

我对 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 调用任何东西。

4

1 回答 1

0

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,以确保您为您的场景使用正确的 API - 他们提到了所有这些。

于 2012-12-06T08:55:42.713 回答