第 306 章 简单的 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 事务中执行所有使用和聚合,无需外部存储来持久保留中间状态,这避免了上面描述的读写成本。实际上,这会产生多个 magnitude 吞吐量。

满足完成条件后,按大小或期限自第一个消息起,聚合的 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 队列。默认情况下,targetName 被解释为队列名称。

sjms:FOO.BAR

如果需要,您可以包含可选的 queue: 前缀:

sjms:queue:FOO.BAR

不支持主题消耗,因为该上下文中无法使用批处理。主题消息通常是非持久性的,并且可以接受丢失。如果在失败的事务中消耗,则代理可能会取消一个主题信息。在这种情况下,可以将普通的 SJMS 使用者端点与常规的非 Persistence 支持的聚合器一起使用。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.