第 25 章 JMS
支持制作者和消费者
此组件允许将消息发送到(或从 )发送到 JMS Queue 或 Topic。它使用 Spring 的 JMS 支持声明性事务,包括 Spring 的 JmsTemplate
来发送和使用 MessageListenerContainer
。
Maven 用户需要在这些组件的 pom.xml
中添加以下依赖项:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jms</artifactId> <version>{CamelSBVersion}</version> <!-- use the same version as your Camel core version --> </dependency>
如果使用 ActiveMQ
,您应该优先使用 ActiveMQ 组件,因为它针对 ActiveMQ 进行了优化。此页中的所有选项和示例也适用于 ActiveMQ 组件。
转换和缓存
,如果您正在使用 JMS 的事务 和缓存级别,请查看下面的部分事务和缓存级别,因为它可能会影响性能。
请求/恢复超过 JMS
,确保阅读 此页面上的"请求 "部分请求,关于请求/回复的重要备注,因为 Camel 提供了多个选项来配置性能和集群环境。
25.1. URI 格式
jms:[queue:|topic:]destinationName[?options]
其中 destinationName
是 JMS 队列或主题名称。默认情况下,targetName
解释为队列名称。例如,要连接到队列,使用 FOO.BAR
:
jms:FOO.BAR
如果您愿意,可以包括可选的 queue:
前缀:
jms:queue:FOO.BAR
要连接到一个主题,您必须 包括 topic:
前缀。例如,要连接到主题(rades .Prices),
请使用:
jms:topic:Stocks.Prices
您可以使用以下格式将查询选项附加到 URI,
?option=value&option=value&…
25.1.1. 使用 ActiveMQ
JMS 组件重复使用 Spring 2 的 JmsTemplate
来发送消息。这在非 J2EE 容器中并不是理想,通常需要在 JMS 提供者中使用一些缓存,以避免 性能不佳。
如果要将 Apache ActiveMQ 用作您的消息代理,则建议您进行以下操作之一:
- 使用已优化的 ActiveMQ 组件,有效地使用 ActiveMQ
-
使用 ActiveMQ 中的
PoolingConnectionFactory
。
25.1.2. 事务和缓存级别
如果您正在使用消息并使用事务(transacted=true
),则缓存级别的默认设置可能会影响性能。
如果您使用 XA 事务,则无法缓存,因为它可能导致 XA 事务无法正常工作。
如果您不使用 XA,那么您应该考虑缓存,因为它会加快性能,例如设置 cacheLevelName=CACHE_CONSUMER
。
cacheLevelName
的默认设置是 CACHE_AUTO
。这个默认自动检测到模式,并相应地设置缓存级别:
-
CACHE_CONSUMER
iftransacted=false
-
CACHE_NONE
iftransacted=true
因此,您可以说默认设置是保守的。如果使用非 XA 事务,请考虑使用 cacheLevelName=CACHE_CONSUMER
。
25.1.3. 可配置订阅
如果要使用持久主题订阅,则需要同时指定 clientId
和 durableSubscriptionName
。clientId
的值必须是唯一的,只能供整个网络中的单个 JMS 连接实例使用。您可能希望 使用虚拟主题 以避免此限制。有关持久消息的更多背景信息,请点击此处。
25.1.4. Message Header Mapping
在使用消息标头时,JMS 规格指出标头名称必须是有效的 Java 标识符。因此,尝试将标头命名为有效的 Java 标识符。这样做的一个优点是,您可以使用 JMS Selector 中的标头(使用 SQL92 语法为标头强制使用 Java 标识符语法)。
默认使用映射标头名称的简单策略。该策略用于替换标题名称中的任何点和连字符(如下所示),并在标头名称通过线从 JMS 消息中恢复时反转替换。这意味着什么?不要更丢失在 bean 组件中调用的方法名称,不再丢失文件组件的文件名标头,以此类推。
Camel 中接受标头名称的当前标头名称策略如下:
- dots 被 'DOT' 替换,当 Camel 使用消息时替换替换
- 连字符由 'HYPHEN' 替换,在 Camel 使用消息时反转。
您可以在 JMS 端点上配置许多不同的属性,它们映射到 JMSConfiguration
对象上的属性。
映射到 Spring JMS
的属性映射到 Spring JMS 上的属性,Camel 用来发送和接收消息。因此,您可以通过咨询相关的 Spring 文档来获取这些属性的更多信息。