58.2. URI 格式
jms:[queue:|topic:]destinationName[?options]
jms:[queue:|topic:]destinationName[?options]
其中 destinationName
是 JMS 队列或主题名称。默认情况下,destinationName
解释为队列名称。例如,要连接到队列,使用 FOO.BAR
:
jms:FOO.BAR
jms:FOO.BAR
如果需要,您可以包含可选的 queue:
前缀:
jms:queue:FOO.BAR
jms:queue:FOO.BAR
要连接到主题,您必须 包含 topic:
前缀。例如,要连接到主题 Stocks.Prices
,请使用:
jms:topic:Stocks.Prices
jms:topic:Stocks.Prices
您可以使用以下格式将查询选项附加到 URI 中,
?option=value&option=value&…
58.2.1. 使用 ActiveMQ
JMS 组件重复使用 Spring 2 的 JmsTemplate
来发送消息。这不是在非J2EE 容器中使用的理想选择,通常需要 JMS 提供程序中的一些缓存以避免 性能不佳。
如果要将 Apache ActiveMQ 用作消息代理,建议执行以下操作之一:
- 使用 ActiveMQ 组件,该组件经过优化以高效地使用 ActiveMQ
-
在 ActiveMQ 中使用
PoolingConnectionFactory
。
58.2.2. 事务和缓存级别
如果您使用消息并使用事务(transacted=true
),缓存级别的默认设置可能会影响性能。
如果您使用 XA 事务,则无法缓存,因为它可能会导致 XA 事务无法正常工作。
如果您不使用 XA,则应考虑缓存速度,如设置 cacheLevelName=CACHE_CONSUMER
。
cacheLevelName
的默认设置是 CACHE_AUTO
。这个默认会自动检测模式,并相应地将缓存级别设置为:
-
如果
transacted=false
-
如果
transacted=true
因此,您可以说默认设置比较保守。如果您使用非 XA 事务,请考虑使用 cacheLevelName=CACHE_CONSUMER
。
58.2.3. 带有 JMS 1.1 的持久化订阅
如果要使用持久主题订阅,则需要同时指定 clientId
和 durableSubscriptionName
。clientId
的值必须是唯一的,且只能由整个网络中的单个 JMS 连接实例使用。
如果您使用 Apache ActiveMQ Classic,您可能更喜欢使用名为 Virtual Topic 的功能。这应该删除具有唯一 clientId
的要求。您可以查阅 Artemis 或 ActiveMQ Classic 的特定文档,以了解有关如何使用此功能的详细信息。您可以在此处找到有关 ActiveMQ 经典持久消息传递的更多详细信息。http://activemq.apache.org/how-do-durable-queues-and-topics-work.html
58.2.3.1. 带有 JMS 2.0 的持久化订阅
如果要使用持久主题订阅,则需要指定 durableSubscriptionName
。
58.2.4. Message Header Mapping
在使用消息标头时,JMS 规范指出标头名称必须是有效的 Java 标识符。因此,请尝试将您的标头命名为有效的 Java 标识符。执行此操作的一个优点是,您可以在 JMS Selector 中使用您的标头(其 SQL92 语法强制使用标头的 Java 标识符语法)。
默认使用映射标头名称的简单策略。策略是替换标头名称中的任何点和连字符,并在从线上发送的 JMS 消息恢复标头名称时反转替换。这意味着什么?不会再丢失在 bean 组件上调用的方法名称,不再丢失 File 组件的文件名标头,以此类推。
在 Camel 中接受标头名称的当前标头名称策略如下:
- 当 Camel 使用消息时,点被 'DOT' 替换,替换会被反向替换
- hyphen 被 'HYPHEN' 替换,当 Camel 使用消息时,替换会被反向替换
您可以在 JMS 端点上配置许多不同的属性,该属性映射到 JMSConfiguration
对象的属性。
映射到 Spring JMS
很多属性映射到 Spring JMS 上的属性,Camel 用来发送和接收消息。因此,您可以通过咨询相关的 Spring 文档来获取有关这些属性的更多信息。