323.11.6. optimistic locking
从 Camel 2.12 开始,您可以打开 optimisticLocking,并在集群环境中使用此基于 JDBC 的聚合存储库,其中多个 Camel 应用程序为聚合存储库共享同一数据库。如果存在一个竞争条件,则 JDBC 驱动程序将抛出一个特定于供应商的异常,则 JdbcAggregationRepository 可以响应。要知道从 JDBC 驱动程序造成异常,作为光明锁定错误,我们需要一个映射程序来执行此操作。因此,有一个 org.apache.camel.processor.aggregate.jdbc.JdbcOptimisticLockingExceptionMapper (如果需要),您可以实施自定义逻辑。有一个默认的实现 org.apache.camel.aggregate.jdbc.DefaultJdbcOptimisticLockingExceptionMapper (如下所示):
以下检查已完成:
-
如果导致的异常是
SQLException,则如果以 23 开始,则检查 SQLState。 -
如果导致的异常是
DataIntegrityViolationException - 如果导致的异常类名称的名称中包含 "ConstraintViolation"。
- 如果配置了任何类名称,可以选择检查 FQN 类名称
您还可以添加 FQN 类名称,如果任何导致异常(或任何嵌套)等于 FQN 类名称的任何错误,则它是一个光纤锁定错误。
以下是一个示例,其中定义了来自 JDBC 供应商的 2 额外 FQN 类名称:
<bean id="repo"
class="org.apache.camel.processor.aggregate.jdbc.JdbcAggregationRepository">
<property name="transactionManager" ref="transactionManager"/> <property
name="repositoryName" value="aggregation"/> <property name="dataSource"
ref="dataSource"/> <property name"jdbcOptimisticLockingExceptionMapper"
ref="myExceptionMapper"/> </bean> <!-- use the default mapper with extra
FQN class names from our JDBC driver --> <bean id="myExceptionMapper"
class="org.apache.camel.processor.aggregate.jdbc.DefaultJdbcOptimisticLockingExceptionMapper">
<property name="classNames"> <util:set>
<value>com.foo.sql.MyViolationExceptoion</value>
<value>com.foo.sql.MyOtherViolationExceptoion</value> </util:set>
</property> </bean>