Java Spring JMSTemplate与ibm.mq.jms.MQQueueConnectionFactory

Java Spring JMSTemplate与ibm.mq.jms.MQQueueConnectionFactory,java,jms,ibm-mq,Java,Jms,Ibm Mq,我正在开发一个JMS密集型应用程序,它发送/接收数十万条消息。我发现性能并不是那么好,并将问题缩小到下面的一行,从我所能看出的根本原因是它与IBM MQ不兼容 JMSTemplate.receive(queueName); 在用一个简单的计时器包装完这段代码后,我发现receive占用了20-50毫秒的时间,由于我处理的吞吐量非常大,随着时间的推移,这些吞吐量肯定会增加。在谷歌搜索了一段时间后,我偶然发现了springs“CachingConnectionFactory”,这是我用下面这样的运

我正在开发一个JMS密集型应用程序,它发送/接收数十万条消息。我发现性能并不是那么好,并将问题缩小到下面的一行,从我所能看出的根本原因是它与IBM MQ不兼容

JMSTemplate.receive(queueName);
在用一个简单的计时器包装完这段代码后,我发现receive占用了20-50毫秒的时间,由于我处理的吞吐量非常大,随着时间的推移,这些吞吐量肯定会增加。在谷歌搜索了一段时间后,我偶然发现了springs“CachingConnectionFactory”,这是我用下面这样的运气实现的(不确定这是否适用于我已经使用的IBM MQ连接工厂)。请注意,为了便于阅读,省略了一些代码

    <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        ...
    </bean>

    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory">
            <ref bean="cacheFactory" />
        </property>
        ...
    </bean>

    <!--This seems to be the magic piece-->
    <bean id="cacheFactory"
        class="org.springframework.jms.connection.CachingConnectionFactory">
        <property name="targetConnectionFactory" ref="ibmMQConnectionFactory" />
        <property name="sessionCacheSize" value="100" />
    </bean>

    <bean id="ibmMQConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
        ...
    </bean>

...
...
...
令我惊讶的是,这将我的JMSTemplate.receive()调用从20-50毫秒减少到了每条消息大约1-2毫秒。我找不到任何可靠的信息来说明这在幕后是如何工作的,以及“sessionCacheSize”将如何影响性能。我的第一个测试使用了50,第二个测试使用了100,第二个选项的速度要快得多。因此,我的问题是,对于一个具有大量吞吐量的应用程序,什么是理想的“ScScCaseSeCISE”,并且用这种方法考虑什么缺点?


我期待着你们在这个问题上的发言……

我对春天的了解有限。但通过阅读您的描述,我相信Spring每次都在做以下事情来接收消息:

1) 创建到IBM MQ队列管理器的连接

2) 打开指定队列

3) 从队列中获取消息

4) 关闭队列

5) 正在关闭连接


由于所有上述操作,接收单个消息所需的时间更长。但当会话被缓存时,Spring会重新使用缓存的连接。因此,更好的消息接收吞吐量。

我对Spring的了解有限。但通过阅读您的描述,我相信Spring每次都在做以下事情来接收消息:

1) 创建到IBM MQ队列管理器的连接

2) 打开指定队列

3) 从队列中获取消息

4) 关闭队列

5) 正在关闭连接

由于所有上述操作,接收单个消息所需的时间更长。但当会话被缓存时,Spring会重新使用缓存的连接。因此,消息接收吞吐量更好