第 306 章 简单的 JMS Batch 组件
从 Camel 版本 2.16 开始提供
SJMS Batch 是专门的组件,可用于来自 JMS 队列的高性能、交易型批处理消耗。它可以被认为是仅限消费者组件和聚合器的混合。
Camel 中的常见用例是消耗来自队列的消息,并在将聚合状态发送到另一个端点前聚合它们。为确保在系统执行处理失败时数据不会丢失,它通常在队列中的事务中消耗,一次聚合存储在持久 聚合Repository
中,如 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 批处理组件消耗性能是线性的。在获取下一个消息前,使用 AggregationStrategy
来消耗并聚合每个消息。因为所有消耗和聚合都是在单个 JMS 事务中执行的,因此不需要外部存储才能保持中间状态 - 这可避免上面描述的读写成本。实际上,这会产生多个数量较高的吞吐量顺序。
满足完成条件后,从第一个消息起按大小或周期,聚合的 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>
306.1. URI 格式
sjms:[queue:]destinationName[?options]
其中 destinationName
是 JMS 队列。默认情况下,destinationName
解释为队列名称。
sjms:FOO.BAR
如果需要,您可以包含可选的 queue:
前缀:
sjms:queue:FOO.BAR
不支持主题消耗,因为该上下文中无法使用批处理。主题消息通常是非持久性的,可以接受丢失。如果在失败的事务中使用,则代理可能会不会重新显示主题信息。在这种情况下,普通的 SJMS 消费者端点可与常规的非永久性支持聚合器一起使用。