6.4. 保证交付
概述
保证交付 意味着,消息被放入消息频道后,消息传递系统会保证消息到达其目的地,即使应用的组成部分也应该失败。通常,消息传递系统通过写入消息到持久性存储,在试图将信息传送到目的地之前,实现保证交付模式(如 图 6.4 “Guaranteed Delivery Pattern” 所示)。
图 6.4. Guaranteed Delivery Pattern
支持保证交付的组件
以下 Apache Camel 组件支持有保证的交付模式:
- JMS
- ActiveMQ
- ActiveMQ Journal
- Apache Camel 组件 参考指南中的文件组件
JMS
在 JMS 中,deliveryPersistent
查询选项指示是否启用了永久存储消息。通常,不需要设置这个选项,因为默认行为是启用持久发送。要配置保证交付的所有详细信息,需要在 JMS 提供程序上设置配置选项。具体信息会根据您使用的 JMS 供应商的不同而有所不同。例如,MQSeries、TibCo、BEA、Sonanic 和其他公司都提供各种服务质量来支持保证交付。
如需了解更多详细信息,请参阅 Apache Camel 组件参考指南 > 中的 Jms。
ActiveMQ
在 ActiveMQ 中,消息持久性会被默认启用。从版本 5 开始,ActiveMQ 将 AMQ 消息存储用作默认的持久性机制。您可以使用几种不同方法在 ActiveMQ 中增强消息持久性。
最简单的选项(与 图 6.4 “Guaranteed Delivery Pattern”区分)是在中央代理中启用持久性,然后使用可靠的协议连接到该代理。在将消息发送到中央代理后,对消费者进行交付得到保证。例如,在 Apache Camel 配置文件中,META-INF/spring/camel-context.xml
可以配置 ActiveMQ 组件以使用 OpenWire/TCP 协议连接到中央代理:
<beans ... > ... <bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent"> <property name="brokerURL" value="tcp://somehost:61616"/> </bean> ... </beans>
如果您希望在发送到远程端点(类似于 图 6.4 “Guaranteed Delivery Pattern”)之前,在发送到远程端点(类似于 )之前存储消息的架构,请在 Apache Camel 应用程序中实例化嵌入的代理来实现这个架构。实现这一点的一种简单方法是使用 ActiveMQ Peer-to-Peer 协议,可隐式创建嵌入代理以与其他对等端点通信。例如,在 camel-context.xml
配置文件中,您可以将 ActiveMQ 组件配置为连接到组 GroupA
中的所有同级服务器,如下所示:
<beans ... > ... <bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent"> <property name="brokerURL" value="peer://GroupA/broker1"/> </bean> ... </beans>
其中 broker1
是嵌入式代理的代理名称(组中的其它对等点应该使用不同的代理名称)。Peer-to-Peer 协议的一个限制功能是它依赖于 IP 多播在其组中定位其他同级服务器。这使在广域网(以及一些没有启用 IP 多播的局域网中)无法使用它。
在 ActiveMQ 组件中创建嵌入式代理更灵活的方法是利用 ActiveMQ 的虚拟机协议,后者连接到嵌入式代理实例。如果所需名称的代理尚不存在,则虚拟机协议会自动创建。您可以使用此机制创建带有自定义配置的嵌入式代理。例如:
<beans ... > ... <bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent"> <property name="brokerURL" value="vm://broker1?brokerConfig=xbean:activemq.xml"/> </bean> ... </beans>
其中 activemq.xml
是 ActiveMQ 文件,用于配置嵌入的代理实例。在 ActiveMQ 配置文件中,您可以选择启用以下持久性机制之一:
- AMQ 持久性(默认)将 A fast 和 reliable 的消息存储是 ActiveMQ 原生的。详情请查看 amqPersistenceAdapter 和 AMQ Message Store。
- JDBC 持久性 TOKEN-TOKEN 使用 JDBC 将消息存储在任何兼容 JDBC 的数据库中。详情请查看 jdbcPersistenceAdapter 和 ActiveMQ Persistence。
- 日志持久性 containerruntime-RbacConfig A fast 持久性机制,将消息存储在滚动日志文件中。详情请参阅 journalPersistenceAdapter 和 ActiveMQ Persistence。
- Kaha Persistence TOKEN-DCES A 持久性机制专为 ActiveMQ 专门开发。详情请查看 kahaPersistenceAdapter 和 ActiveMQ Persistence。
如需了解更多详细信息,请参阅 Apache Camel 组件参考指南 中的 ActiveMQ。
ActiveMQ Journal
ActiveMQ Journal 组件针对一个特殊用例优化,其中有多个并发生产者向队列写入消息,但只有一个活动使用者。消息存储在滚动日志文件中,并聚合并发写入以提高效率。