Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 当客户端使用临时replyTo队列时,如何解决jms服务器性能问题?_Spring_Mule_Ibm Mq_Spring Jms_Mule Component - Fatal编程技术网

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

Spring 当客户端使用临时replyTo队列时,如何解决jms服务器性能问题?,spring,mule,ibm-mq,spring-jms,mule-component,Spring,Mule,Ibm Mq,Spring Jms,Mule Component,我目前正在构建一个使用请求-响应jms连接器的Mule ESB服务器应用程序。由于它在高度并发的环境中使用,我们在MQ配置中启用了SpringJMS缓存 <spring:beans> <mule> <!-- MQ Factory --> <spring:bean id="testMsgMqFactoryBean1" name="testMsgMqFactory1" class="com.ibm.mq.jms.MQQ

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

<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>
在调查MQ错误代码(MQJE001:Completion code 2,Reason 2017)后,我发现此错误背后的原因是我们从未关闭生产者,生产者耗尽了队列管理器上的MQ句柄。快速而简单的修复方法是每次取消对SpringJMS缓存配置中的行的注释以关闭生产者

<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处理程序

多谢各位
-Lei

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

临时队列和性能绝对不是您可以同时拥有的两件事情。我想提出另一种可能性:

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


您可以使用一个众所周知的队列进行回复,使用头和主机名的组合来接收消息,加上每个使用者节点上不同的选择器,以及发送消息上的TTL,以使消息在一段时间后消失。

此新应用程序将取代使用消息驱动bean的旧应用程序。遗留应用程序使用动态replyTo队列使用相同客户机的请求,并且不存在性能问题。传统应用程序也不会缓存发送者(生产者)。有什么想法吗?试试{QueueSession session=mqSession.getSession();replyToQueue=createReplyToQueue(session);sender=session.createSender(replyToQueue);TextMessage=session.createTextMessage(invocation.getResponse());message.setJMSCorrelationID(GetJMSRRequest().getJMSMessageID());getLogger().logDebug(methodName,“将响应发送到[“+replyToQueue+”]”;sender.send(消息);getLogger().logDebug(方法名,“将响应发送到[“+replyToQueue+”]”);setJmsResponse(消息);return;}最后{JmsUtil.closeJmsResource(发送方);}”你知道为什么制作人从来没有关闭过吗?你是在自己的代码中创建的还是mule创建的?如果是这样的话,可能值得向他们的问题跟踪者报告。Stephane,不是mule没有关闭制作人,而是因为我们使用了spring jms CachingConnectionFactory。它缓存会话和代理jms API用于缓存目的s(消费者、生产者)。我很困惑。你需要在某个时候关闭会话,这将清理一切。
CachingConnectionFactory
缓存这些与问题无关。唯一的做法是确保为当前事务返回缓存生产者,但不返回你(或Mule)负责关闭会话!(在该类中选中
physicalClose()
<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>