java - JAX-WS 连接不会关闭,并在 x 条消息后停止消息传递

标签 java spring jms activemq messaging

我在使用 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 的东西。

最佳答案

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 - 他们提到了所有这些。

关于java - JAX-WS 连接不会关闭,并在 x 条消息后停止消息传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13610185/

相关文章:

java - 在 Java 中拆分字符串的最佳方法

javascript - 如何提供解耦的 React 前端?

java - JMS-分布式事务

java - 无法启动 ActiveMQ JMS 消息代理

Apache Camel - 动态构建端点和端点

java - 如何提取位于页面源脚本标记内的字符串

Java:如何反转ArrayList中每N个元素的顺序

javassist_123 与 javassist.util.proxy.Proxy 不兼容?

java - 带有 Azure 应用服务的 Spring Boot 应用端点

security - 如何使用 Spring Security 3.0.x 处理 HTTP 403