gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:08:29 25 4
gpt4 key购买 nike

我在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com