290.11. 事务支持
BAPI 事务模型
SAP 组件支持 BAPI 事务模型,用于与 SAP 的出站通信。具有包含 transacted 选项设为 true
的 URL 的目的地端点,在端点的出站连接上启动有状态会话,并使用交换注册 Camel 同步对象。
此同步对象调用 BAPI_TRANSACTION_COMMIT
,并在消息交换处理完成后结束有状态会话。如果消息交换的处理失败,同步对象调用 BAPI 服务器方法 BAPI_TRANSACTION_ROLLBACK
,并结束有状态会话。
RFC 事务模型
tRFC 协议通过唯一事务标识符(TID)识别每个事务请求(TID)来实现 AT-MOST-ONCE 交付和处理保证。TID 遵循协议中发送的每个请求。使用 tRFC 协议发送应用程序必须识别在发送请求时具有唯一 TID 的请求的每个实例。应用程序可以多次发送带有给定 TID 的请求,但协议可确保最多在接收系统中发送和处理请求。当发送请求时,应用程序可能会选择重新发送带有给定 TID 的请求,因此是否向接收系统中发送和处理请求。通过在遇到通信错误时重新发送请求,使用 tRFC 协议的客户端应用程序可以确保 EXACTLY-ONCE 交付和处理保证。
要使用哪个事务模型?
BAPI 事务是一个应用程序级别的事务,在某种程度上,它会对 BAPI 方法或 SAP 数据库中 BAPI 方法或 RFC 功能执行的持久性数据更改施加 ACID 保证。RFC 事务是一个通信事务,它对 BAPI 方法和/或 RFC 功能的请求施加交付保证(AT-MOST-ONCE、EXACTLY-ONCE-IN-ORDER)。
事务 RFC 目标端点
以下目的地端点支持 RFC 事务:
-
sap-trfc-destination
-
sap-qrfc-destination
单个 Camel 路由可以包含多个事务 RFC 目标端点,将消息发送到多个 RFC 目的地,甚至多次将消息发送到同一 RFC 目的地。这意味着 Camel SAP 组件可能需要跟踪每个 Exchange
对象的事务 ID (TID)。现在,如果路由处理失败且必须重试,则情况会非常复杂。RFC 事务语义要求每个 RFC 目的地都必须使用第一次 使用的同一 TID 调用(以及每个目的地的 TID 相互不同)。换句话说,Camel SAP 组件必须跟踪在路由中使用的 TID,并记住此信息,以便 TID 能够按照正确顺序重新执行。
默认情况下,Camel 不提供一个机制,它允许 交换
知道路由中的位置。要提供这样的机制,需要将 CurrentProcessorDefinitionInterceptStrategy
拦截器安装到 Camel 运行时。此拦截器必须安装在 Camel 运行时,才能跟踪使用 Camel SAP 组件的路由中的 TID。有关如何配置拦截器的详情,请参考 “TRFC 和 qRFC 目的地的拦截器”一节。
事务 RFC 服务器端点
以下服务器端点支持 RFC 事务:
-
sap-trfc-server
当 Camel 交换处理事务请求遇到处理错误时,Camel 通过其标准错误处理机制处理处理错误。如果 Camel 路由处理被配置为将错误传播到调用者,则发起交换的 SAP 服务器端点会记录失败,发送 SAP 系统会收到错误通知。然后,发送 SAP 系统可以通过发送另一个具有相同 TID 的事务请求来响应请求,以再次处理请求。