14.3. 优化客户端 JMS 性能
概述
两个主要设置会影响客户端的 JMS 性能:池和同步接收。
池
在客户端上,Fcxf 会为每个消息创建一个新的 JMS 会话和 JMS producer。因此,会话和制作者对象都不是线程安全。创建制作者特别密集型,因为它需要与服务器通信。
池连接工厂通过缓存连接、会话和制作者来提高性能。
对于 ActiveMQ,配置池很简单,例如:
import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.activemq.pool.PooledConnectionFactory; ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616"); PooledConnectionFactory pcf = new PooledConnectionFactory(); //Set expiry timeout because the default (0) prevents reconnection on failure pcf.setExpiryTimeout(5000); pcf.setConnectionFactory(cf); JMSConfiguration jmsConfig = new JMSConfiguration(); jmsConfig.setConnectionFactory(pdf);
有关池的更多信息,请参阅 Red Hat JBoss Fuse Transaction Guide中的 "Appendix A Optimizing Performance of JMS Single-Resource Transactions"
避免同步接收
对于请求/回复交换,JMS 传输会发送请求,然后等待回复。在可能的情况下,使用 JMS MessageListener
异步实施请求/回复消息传递。
但是,当 CXF 需要在端点之间共享队列时,使用同步的 Consumer.receive ()
方法。此场景需要 MessageListener
来使用消息选择器来过滤消息。消息选择器必须提前知道,因此 MessageListener
只打开一次。
应避免提前知道消息选择器的两个情况:
当
JMSMessageID
用作JMSCorrelationID
时如果 JMS 属性
useConduitIdSelector
和conduitSelectorPrefix
没有在 JMS 传输上设置,则客户端不会设置JMSCorrelationId
。这会导致服务器将请求消息的JMSMessageId
用作JMSCorrelationId
。因为无法提前知道JMSMessageID
,客户端必须使用同步的Consumer.receive ()
方法。请注意,您必须将
Consumer.receive ()
方法与 IBM JMS 端点(默认)一起使用。用户在请求消息中设置
JMStype
,然后设置自定义JMSCorrelationID
。同样,因为不能提前知道自定义
JMSCorrelationID
,客户端必须使用同步的Consumer.receive ()
方法。
因此,常规规则是避免使用需要使用同步接收的设置。