326.15. 将正文和标头存储为文本
从 Camel 2.11 开始提供
您可以将 JdbcAggregationRepository
配置为存储消息正文,并在单独的列中选择(ed)标头作为 String。例如,要存储正文,以下两个标头 companyName
和 accountName
使用以下 SQL:
然后,配置存储库以启用此行为,如下所示:
326.15.1. codec (Serialization) 复制链接链接已复制到粘贴板!
由于它们可以包含任何类型的有效载荷,因此交换的设计不适合。它转换为存储在数据库 BLOB 字段中的字节数组。所有这些转换都由 JdbcCodec
类处理。代码的一个详情需要注意: ClassLoadingAwareObjectInputStream
。
ClassLoadingAwareObjectInputStream
已从 Apache ActiveMQ 项目中重复使用。它打包了一个 ObjectInputStream
,并将其与 ContextClassLoader
而不是 currentThread
一起使用。好处是能够加载由其他捆绑包公开的类。这允许交换正文和标头具有自定义类型对象引用。
326.15.2. Transactions 复制链接链接已复制到粘贴板!
需要 Spring PlatformTransactionManager
来编配事务。
326.15.2.1. Service (Start/Stop) 复制链接链接已复制到粘贴板!
start
方法验证数据库的连接和所需表是否存在。如果出现错误,它将在启动过程中失败。
326.15.3. 聚合器配置 复制链接链接已复制到粘贴板!
根据目标环境,聚合器可能需要一些配置。如您已经知道,每个聚合器应具有自己的存储库(在数据库中创建对应的表对)和数据源。如果默认的 lobHandler 没有根据您的数据库系统进行调整,则可以将其与 lobHandler
属性注入。
以下是 Oracle 的声明:
326.15.4. Optimistic locking 复制链接链接已复制到粘贴板!
从 Camel 2.12 开始,您可以打开 optimisticLocking
,并在集群环境中使用基于 JDBC 的聚合存储库,其中多个 Camel 应用程序为聚合存储库共享同一数据库。如果存在竞争条件,则 JDBC 驱动程序将抛出特定于供应商的异常,Jdb cAggregationRepository
可以响应。要了解将 JDBC 驱动程序中的异常视为 optimistick 锁定错误,我们需要一个映射器才能执行此操作。因此,有一个 org.apache.camel.processor.aggregate.jdbc.JdbcOptimisticLockingExceptionMapper
允许您实现自定义逻辑(如果需要)。有一个默认的 org.apache.camel.processor.aggregate.jdbc.DefaultJdbcOptimisticLockingExceptionMapper
,它可以正常工作:
以下检查已完成:
-
如果导致异常是
SQLException
,则如果以 23 开始,则会检查 SQLState。 -
如果原因异常是
DataIntegrityViolationException
- 如果原因异常类名称的名称中包含 "ConstraintViolation"。
- 如果配置了任何类名称,对 FQN 类名称的可选检查都匹配
您还可以添加 FQN 类名称,如果任何原因异常(或任何嵌套)等于任何 FQN 类名称,则其 optimistick 锁定错误。
例如,我们从 JDBC 供应商定义了 2 个额外的 FQN 类名称: