290.11. 事务支持
BAPI 事务模型
SAP 组件支持 BAPI 事务模型与 SAP 进行出站通信。将包含 transacted 选项设置为 true
的 URL 的目标端点会在端点的出站连接上启动有状态会话,并使用交换注册 Camel 同步对象。
此同步对象调用 BAPI 服务方法 BAPI_TRANSACTION_COMMIT
,并在消息交换完成时结束有状态会话。如果消息交换的处理失败,同步对象会调用 BAPI 服务器方法 BAPI_TRANSACTION_ROLLBACK
并终止有状态会话。
RFC 事务模型
tRFC 协议通过识别具有唯一事务标识符(TID)的每个事务请求来实现 AT-MOST-ONCE 交付和处理保证。TID 附带协议中发送的每个请求。使用 tRFC 协议发送应用程序必须在发送请求时标识带有唯一 TID 的请求的每个实例。应用程序可能会多次发送带有给定 TID 的请求,但协议可确保最多在接收系统中发送和处理请求。应用程序可以选择在发送请求时遇到通信或系统错误时重新发送带有给定 TID 的请求,因此与在接收系统中发送和处理请求时的不确定性。通过在遇到通信错误时重新发送请求,使用 tRFC 协议的客户端应用可以确保 EXACTLY-ONCE 传输和处理其请求保证。
要使用哪种事务模型?
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 调用,该 ID 首次使用(以及每个目的地的 TID 相互不同)。换句话说,Camel SAP 组件必须跟踪在路由中使用的 TID,并记住此信息,以便可以按照正确顺序重新执行 TID。
默认情况下,Camel 不提供一种机制,使 Exchange
能够知道它在路由中的位置。要提供这样的机制,需要将 CurrentProcessorDefinitionInterceptStrategy
拦截器安装到 Camel 运行时中。此拦截器必须安装到 Camel 运行时中,才能在带有 Camel SAP 组件的路由中跟踪 TID。有关如何配置拦截器的详情,请参考 “tRFC 和 qRFC 目的地的拦截器”一节。
事务的 RFC 服务器端点
以下服务器端点支持 RFC 事务:
-
sap-trfc-server
当 Camel 交换处理事务请求遇到处理错误时,Camel 通过其标准错误处理机制来处理处理错误。如果 Camel 路由处理被配置为将错误传播到调用者,则发起交换的 SAP 服务器端点会记录故障,并且发送 SAP 系统会收到错误通知。然后,发送 SAP 系统可以通过发送另一个具有相同 TID 的事务请求来再次处理请求。