289.7. 事务支持
BAPI 事务模型
SAP 组件支持 BAPI 事务模型用于与 SAP 进行出站通信。如果需要,如果将含有 transacted 选项设为 true
的 URL 的 URL 的目标端点,在端点的出站连接上启动有状态会话,并通过交换注册 Camel Synchronization 对象。此同步对象将调用 BAPI 服务方法 BAPI_TRANSACTION_COMMIT
,并在处理消息交换时结束有状态会话。如果消息交换的处理失败,同步对象将调用 BAPI_TRANSACTION_ROLLBACK
并结束有状态会话。
RFC 事务模型
tRFC 协议通过使用唯一事务标识符(TID)识别每个事务请求(TID)来实现 AT-MOST-ONCE 交付和处理保证。TID 配有协议中发送的每个请求。使用 tRFC 协议发送应用程序必须在发送请求时识别具有唯一 TID 的请求实例。应用程序可以多次发送带有给定 TID 的请求,但协议可确保请求在接收系统中最多交付并处理。当遇到通信或系统错误时,应用程序可以选择在发送请求时重新发送带有给定 TID 的请求,因此与在接收系统中是否交付并处理了该请求的问题。通过在遇到通信错误时重新发送请求,使用 tRFC 协议的客户端应用程序可以确保 EXACTLY-ONCE 交付并处理请求的保证。
要使用哪些事务模型?
BAPI 事务是一个应用程序级别事务,它有意义了 ACID 可保证由 BAPI 方法或 SAP 数据库中 RFC 功能执行的持久性数据更改。RFC 事务是一种通信事务,以合理方式提供保证(AT-MOST-ONCE、EXACTLY-ONCE、EXACTLY-ONCE-IN-ORDER)请求 BAPI 方法和/或 RFC 功能。
事务性 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 不提供一种机制,使 Exchange
能够知道路由中的位置。要提供这样的机制,需要在 Camel 运行时安装 CurrentProcessorDefinitionInterceptStrategy
拦截器。此拦截器必须安装到 Camel 运行时,以便 Camel SAP 组件跟踪路由中的 TID。有关如何配置拦截器的详情,请参考 “拦截器用于 tRFC 和 qRFC 目的地”一节。
事务性 RFC 服务器端点
以下服务器端点支持 RFC 事务:
-
sap-trfc-server
当 Camel 交换处理事务请求遇到处理错误时,Camel 通过其标准错误处理机制来处理错误。如果 Camel 路由处理过程被配置为将错误传播到调用者,发起交换的 SAP 服务器端点会注意到失败,发送 SAP 系统会收到该错误通知。发送 SAP 系统随后可以通过使用相同的 TID 发送另一个事务请求来再次处理请求。