gpt4 book ai didi

spring - 当客户端使用临时replyTo队列时如何解决jms服务器性能问题?

转载 作者:行者123 更新时间:2023-12-02 04:03:03 37 4
gpt4 key购买 nike

我目前正在构建一个使用请求-响应 jms 连接器的 Mule ESB 服务器应用程序。由于它是在高并发环境中使用的,因此我们在 MQ 配置中启用了 spring jms 缓存。

<spring:beans>
<mule>
<!-- MQ Factory -->
<spring:bean id="testMsgMqFactoryBean1" name="testMsgMqFactory1" class="com.ibm.mq.jms.MQQueueConnectionFactory">
<spring:property name="channel" value="${test.msg.mq.channel.1}" />
<spring:property name="queueManager" value="${test.msg.mq.queueManager.1}" />
<spring:property name="hostName" value="${test.msg.mq.hostName.1}" />
<spring:property name="port" value="${test.msg.mq.port.1}" />
<spring:property name="transportType" value="${mq.jms.transportType}" />
</spring:bean>
<spring:bean id="testMsgMqFactoryBeanCache1" class="org.springframework.jms.connection.CachingConnectionFactory">
<spring:property name="targetConnectionFactory" ref="testMsgMqFactoryBean1" />
<spring:property name="sessionCacheSize" value="${test.threading.profile.maxThreadsActive}" />
<spring:property name="cacheConsumers" value="false" />
<!-- <spring:property name="cacheProducers" value="false" /> -->
</spring:bean>
<!-- MQ Connector 1 -->
<jms:custom-connector name="testMsgMqConnector.1" class="org.mule.transport.jms.websphere.WebsphereJmsConnector" doc:name="Custom JMS">
<spring:property name="specification" value="1.1" />
<spring:property name="connectionFactory" ref="testMsgMqFactoryBeanCache1" />
<spring:property name="persistentDelivery" value="false" />
<spring:property name="disableTemporaryReplyToDestinations" value="true" />
<spring:property name="numberOfConsumers" value="${test.threading.profile.maxThreadsActive}" />
<spring:property name="maxRedelivery" value="-1" />
<receiver-threading-profile maxThreadsActive="${test.threading.profile.maxThreadsActive}" maxBufferSize="${test.threading.profile.maxBufferSize}" maxThreadsIdle="${test.threading.profile.maxThreadsIdle}"/>
<reconnect frequency="${mq.jms.reconnection.frequency}" count="${mq.jms.reconnection.count}" blocking="false" />
</jms:custom-connector>

<!-- msgworks inbound and outbound MQ setup -->
<!-- Rewards -->
<jms:endpoint exchange-pattern="request-response" queue="${test.msg.mq.inbound.account.queue}" name="testQueue1" connector-ref="testMsgMqConnector.1" doc:name="JMS" />
</mule>
</spring:beans>

当客户端使用静态replyTo队列时,此配置运行良好。但是,我们有一些客户正在使用动态/临时replyTo队列。由于 org.springframework.jms.connection.CachingConnectionFactory 缓存了生产者,因此对于每个临时的replyTo队列,都会缓存一个生产者对象并且永远不会关闭。处理数百个请求后,应用程序开始抛出异常:

********************************************************************************
Message : Failed to create and dispatch response event over Jms destination "queue://QMGR1/TESTret5a975v53AF980F2006BE02?targetClient=1". Failed to route event via endpoint: null. Message payload is of type: JMSTextMessage
Code : MULE_ERROR-42999
--------------------------------------------------------------------------------
Exception stack is:
1. MQJE001: Completion Code 2, Reason 2017 (com.ibm.mq.MQException)
com.ibm.mq.MQQueueManager:2808 (null)
2. MQJMS2008: failed to open MQ queue TESTret5a975v53AF980F2006BE02(JMS Code: MQJMS2008) (javax.jms.ResourceAllocationException)
com.ibm.mq.jms.MQQueueServices:398 (http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/jms/ResourceAllocationException.html)
3. Failed to create and dispatch response event over Jms destination "queue://QMGR1/TESTret5a975v53AF980F2006BE02?targetClient=1". Failed to route event via endpoint: null. Message payload is of type: JMSTextMessage (org.mule.api.transport.DispatchException)
org.mule.transport.jms.JmsReplyToHandler:173 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transport/DispatchException.html)

在调查 MQ 错误代码(MQJE001:完成代码 2,原因 2017)后,我发现此错误背后的原因是因为我们从未关闭生产者,并且生产者耗尽了队列管理器上的 MQ 句柄。快速而简单的修复方法是取消注释 spring jms 缓存配置中的行以每次关闭生产者。

<spring:bean id="testMsgMqFactoryBeanCache1" class="org.springframework.jms.connection.CachingConnectionFactory">
<spring:property name="targetConnectionFactory" ref="testMsgMqFactoryBean1" />
<spring:property name="sessionCacheSize" value="${test.threading.profile.maxThreadsActive}" />
<spring:property name="cacheConsumers" value="false" />
<spring:property name="cacheProducers" value="false" />
</spring:bean>

现在我没有看到 MQ 问题,而是提出了另一个性能问题,因为没有缓存生产者,所以每次都会创建一个新的生产者。

我的问题是,如何处理这种情况?由于客户端不会改变从临时队列接收回复消息的方式,我们如何才能避免耗尽 MQ 处理程序而不影响性能。

非常感谢- 雷

最佳答案

这是一个非常有趣的用例。然而,恐怕没有任何现成的方法可以解决这个问题。有更明显的解决方案:禁用缓存或扩展 spring 缓存提供程序。

临时队列和性能绝对不是可以同时拥有的两件事。我建议另一种可能性:

如果您使用临时队列将响应仅返回给给定的使用者,可能除了在重新连接时丢弃旧消息之外:

您可以使用众所周知的回复队列,使用 header 与应该接收消息的主机名的组合,加上每个消费者节点上不同的选择器以及发送的消息的 TTL,以使它们在一段时间后消失.

关于spring - 当客户端使用临时replyTo队列时如何解决jms服务器性能问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24517532/

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