第 305 章 简单 JMS Batch 组件
作为 Camel 版本 2.16 可用
SJMS Batch 是 JMS 队列中具有高性能、事务批处理使用的专用组件。它可以被看作是仅消费者的组件和聚合器的混合。
Camel 中的常见用例是使用来自队列的消息,并在将聚合状态发送到另一个端点前对其进行聚合。为确保数据在执行处理失败时不会丢失,它通常会使用来自队列的事务中,并且聚合到持久聚合了(如 JDBC 组件 中找到的)中。
聚合器模式的行为涉及在聚合了传入消息前从 AggregationRepository
中获取数据,并在结果后回写结果。从本质上讲,当聚合工件的数量增加时,读取和写入会逐渐增加。使用任意时间单元的这个示例显示这个影响如下:
项 | 读取时间 | 写时间 | 总时间 |
---|---|---|---|
0 | 0 | 1 | 1 |
1 | 1 | 2 | 4 |
2 | 2 | 3 | 9 |
3 | 3 | 4 | 16 |
4 | 4 | 5 | 25 |
5 | 5 | 6 | 36 |
6 | 6 | 7 | 49 |
7 | 7 | 8 | 64 |
8 | 8 | 9 | 81 |
9 | 9 | 10 | 100 |
相反,使用 SJMS Batch 组件消耗性能是线性的。在获取下一个消息前,每个消息都会使用 AggregationStrategy
进行消耗和聚合。由于所有消耗和聚合都在单一 JMS 事务中执行,因此不需要保留中间状态,从而避免了上述的读取和写入成本。实际上,这会产生多个更高吞吐量的订单。
满足完成条件后,根据大小或周期在第一个消息后,就会将聚合的 Exchange
传递到路由。在此 Exchange
处理过程中,如果引发异常或系统关闭,则所有原始使用的消息都后端在队列中(或者被置于死信队列上,具体取决于代理配置)。
与使用常规聚合器不同的是,没有聚合条件的功能,这意味着无法将消耗在多个消息组中。所有使用的消息都会聚合到单个批处理中。
有多个 JMS 使用者支持允许您使用一个路由并行使用,同时使用 JMS 消息组等功能来分组相关消息。
Maven 用户需要将以下依赖项添加到其 pom.xml
中:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-sjms</artifactId> <version>x.x.x</version> <!-- use the same version as your Camel core version --> </dependency>
305.1. URI 格式
sjms:[queue:]destinationName[?options]
其中 destinationName
是 JMS 队列。默认情况下,targetName
解释为队列名称。
sjms:FOO.BAR
如果需要,可以包括可选 queue:
前缀:
sjms:queue:FOO.BAR
不支持主题消耗,因为在该上下文中不使用批处理功能没有优点。主题消息通常非持久性,而且丢失是可以接受的。如果在失败的事务中使用,则代理可能无法对主题消息进行恢复。在这种情况下,可以将普通 SJMS 使用者端点与常规非永久性支持的聚合器一起使用。