14.3. 优化客户端 - 通过防火墙 JMS 性能


概述

两种主要设置会影响客户端的 JMS 性能:池和同步接收。

在客户端一端,CXF 会为每条消息创建一个新的 JMS 会话和 JMS producer。因此,因为 session 和 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 事务指南中的"Appendix A Optimizing Performance of JMS Single- and Multiple-Resource Transactions"。

避免同步接收

对于请求/重新交换,JMS 传输会发送请求,然后等待回复。在可能的情况下,使用 JMS MessageListener 以异步方式实施请求/回复。

但是,当 CXF 需要共享端点之间的队列时,CXF 必须使用 synchronous Consumer.receive () 方法。此场景需要 MessageListener 来使用消息选择器来过滤消息。邮件选择器必须提前已知,因此 MessageListener 只只打开一次。

应该避免避免出现消息选择器的两种情况:

  • 当将 JMSMessageID 用作 JMSCorrelationID

    如果 JMS 属性使用ConduitIdSelectorconduitSelectorPrefix,则客户端不会设置 JMSCorrelationId。这会导致服务器使用 JMSMessageId 请求的消息作为 JMSCorrelationId。由于 JMSMessageID 无法事先知道,客户端必须使用同步的 Consumer.receive () 方法。

    请注意,您必须将 Consumer.receive () 方法用于 IBM JMS 端点(默认)。

  • 用户在请求消息中设置 JMStype,然后设置自定义 JMSCorrelationID

    同样,因为无法事先知道自定义 JMSCorrelationID,客户端必须使用同步的 Consumer.receive () 方法。

因此,常规规则是避免使用需要同步接收的设置。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.