ABAP 扩展模块提供的大多数功能都在 SAP 应用程序内部执行。对于每个连接器必须实现的大多数虚拟功能,SAP 应用程序中存在一个对应的 ABAP 功能模块。但是,由于 SAP 不提供支持 init()、doVerbFor() 和 pollForEvents() 方法的特定需求的 ABAP 功能模块,因此这些功能模块是作为连接器模块的一部分开发和交付的。虽然 Java 组件提供了某些功能,但处理这些方法的主要工作由 SAP 应用程序中的 ABAP 组件来完成。
表 38 显示连接器模块实现的虚拟 Java 方法及其相应的 ABAP
组件。记住,此表不提供由连接器使用的 ABAP 组件的完整列表。
Java 组件 | ABAP 组件 |
---|---|
doVerbFor() | Y_XR_RFC_DO_VERB_NEXTGEN |
getVersion() | 不需要实现 |
getBOHandlerForBO | 不需要实现 |
init() | Y_XR_RFC_LOGON |
pollForEvents() | Y_XR_RFC_EVENT_REQUEST Y_XR_RFC_EVENT_RETURN |
terminate() | 不需要实现 |
这些 ABAP 功能模块合起来就是 ABAP 扩展模块的核心。以下各节描述连接器初始化、业务对象处理和连接器如何处理事件通知。
本章的其余部分中讨论已实现的功能。
init() 方法调用 ABAP 功能模块 Y_XR_RFC_LOGON 来验证目标 SAP 应用程序是否正在运行以及 RFC 库是否可用于执行 ABAP 功能模块。如果该功能模块未成功执行,则连接器终止。
SAP 的所有服务调用请求都由连接器模块的 Java 组件中的 doVerbFor() 方法启动。连接器的 ABAP 功能模块 Y_XR_RFC_DO_VERB_NEXTGEN 和连接器模块的 ABAP 组件中 ABAP 处理程序处理这些请求。
图 65 举例说明了业务对象处理。
在连接器模块的 Java 组件中,单个业务对象处理程序实现的 doVerbFor() 方法处理来自集成代理程序的所有业务对象请求以及来自 pollForEvents() 方法的所有业务对象事件。在任一情况下,doVerbFor() 以下列方式执行:
doVerbFor() 方法将业务对象数据传递至功能模块 Y_XR_RFC_DO_VERB_NEXTGEN ,然后根据返回的业务对象数据创建一种全新的业务对象结构。
在连接器模块的 ABAP 组件中,连接器的 ABAP 功能模块 Y_XR_RFC_DO_VERB_NEXTGEN 负责SAP 应用程序中的所有 WebSphere 业务对象处理。特别是,它将业务对象数据传递至适当的 ABAP 处理程序。从这种意义上来说,可以认为功能模块 Y_XR_RFC_DO_VERB_NEXTGEN 是一个业务对象路由器。它始终以下列方式执行:
Y_XR_RFC_DO_VERB_NEXTGEN 使用 ABAP 处理程序来完成每种对象类型和特定于查询描述的请求。Y_XR_RFC_DO_VERB_NEXTGEN 使用特定于应用程序的业务对象查询描述信息中值来确定要调用哪个 ABAP 处理程序。可以认为 Y_XR_RFC_DO_VERB_NEXTGEN 是从 doVerbFor() 方法至 ABAP 处理程序的路由器。
ABAP 处理程序是连接器模块所独有的,这些处理程序从连接器模块的 Java 组件扩展业务对象处理程序功能。ABAP 处理程序以 ABAP 功能模块的形式驻留在 SAP 应用程序中并直接与 Y_XR_RFC_DO_VERB_NEXTGEN 通信。将业务对象数据输入或输出 SAP 应用程序数据库需要 ABAP 处理程序。
图 66 举例说明了 ABAP 扩展模块的业务对象处理组件及这些组件的相互关系。注意,对于单个业务对象处理程序(doVerbFor())和业务对象路由器(Y_XR_DO_VERB_NEXTGEN),存在多个 ABAP 处理程序。
ABAP 处理程序负责将业务对象数据添加至 SAP 应用程序数据库(创建、更新或删除),或负责使用业务对象数据作为键来从 SAP 应用程序数据库检索数据(检索)。
适配器提供通用 ABAP 处理程序。例如,功能模块 Y_XR_RFC_DYNAMIC_TRANSACTION 支持对平面业务对象执行创建、更新、删除和检索操作。
WebSphere Business Integration 系统提供一个元数据资源库和一个通用 ABAP 处理程序来支持平面业务对象。适配器也提供一个 ABAP 处理程序(Y_XR_IDOC_HANDLER)来支持分层业务对象;但是,您必须为您需要支持的每个分层业务对象开发额外的特定于业务对象的 ABAP 处理程序。
WebSphere Business Integration 系统提供一些有助于开发过程的工具。有关开发业务对象和 ABAP 处理程序的更多信息,请参阅为 ABAP 扩展模块开发业务对象和使用 SAPODA 生成业务对象定义。
事件通知指一些进程的集合,这些进程将 SAP 应用程序对象事件通知连接器。通知包括(但不限于)事件(对象和查询描述)的类型和外部系统检索相关数据所需要的数据键。
图 67 举例说明了使用 pollForEvents() 方法的事件通知进程。
连接器的事件通知由两个功能组成:
事件轮询由 pollForEvents() 方法执行的三个功能组成:
事件请求是在 SAP 应用程序中从事件表轮询和检索事件的过程。Java 组件的事件请求机制在 SAP 应用程序中具有一个对应的功能模块 Y_XR_RFC_EVENT_REQUEST。此功能从连接器的 ABAP 事件表 YXR_EVENTS 检索事件。
每个触发的事件进入事件表时,初始状态为预排队(在事件表中标记为 P 的状态),缺省事件优先级为 0。必须将事件的状态更改为已排队(事件表中的 Q),然后才能处理事件。在连接器检索事件所表示的完整对象之前,事件的优先级必须为 0。有关事件优先级的更多信息,请参阅事件优先级。
如果对创建事件和事件键的用户组合不存在数据库锁定,则该事件的状态从预排队更改为已排队。如果锁定存在,则事件的状态将设置为“已锁定”(事件表中的 L)并且将把该事件重新排队。ABAP 常量 C_MAXIMUM_REQUEUE 定义可以将事件重新排队的次数。如果达到最大次数(缺省为 100),则将把该事件归档至事件归档表。
在预处理所有预排队的事件之后,ABAP 功能模块 Y_XR_RFC_EVENT_REQUEST 选择要返回至连接器模块的 Java 组件中事件请求方法的事件(只能选择状态为已排队的事件)。特定于连接器的配置属性 PollQuantity(缺省为 20)确定为单个轮询返回的最大事件数。有关更多信息,请参阅运行连接器。
事件请求机制分两步执行事件选择过程:
这些事件将专用于事件分布表中的特定集成代理程序。在此表中指定的集成代理程序的名称必须与在启动连接器的快捷方式中指定的名称匹配。例如,在 Windows 上运行的 SAP 连接器的标准快捷方式具有以下格式:
...\start_SAP.bat SAPconnectorName integrationBrokerName -cConfigFileName
当 WMQI 是集成代理程序时,WebSphere Business Integration 系统通过从连接器的启动命令中获取值来标识在事件分布表中指定的集成代理程序:
例如,如果特定于连接器的配置属性 PollQuantity 保持在 20,并且有 8 个事件专用于特定连接器和集成代理程序,则该机制选择没有为事件分布配置的其它 12 个事件。
当 WMQI 是集成代理程序且只配置了一个队列管理器时,队列的名称对于集成代理程序的每个实例必须是唯一的。当 WMQI 是集成代理程序且只配置了一个集群时,队列的名称对于集群内的每个集成代理程序必须是唯一的。
如果愿意,您可以将代理程序的名称(在启动命令的 integrationBrokerName 参数中指定)或连接器的名称合并为队列的名称。例如,如果两个代理程序命名为 WMQI1 和 WMQI2,则其各自的 ADMINOUTQUEUE 可能分别命名为 ADMINOUTQUEUE_MQI1 和 ADMINOUTQUEUE_MQI2。
事件请求功能根据 YXR_EVENTS 事件表生成一组要处理的事件。该功能将这些事件传递至事件处理功能,事件处理功能按以下方式每次处理一个事件:
在事件请求处理了每个事件之后,将使用功能模块 Y_XR_RFC_EVENT_RETURN 把每个事件返回至 SAP 应用程序。此功能模块生成已处理事件的副本,并将该副本添加至事件归档表(YXR_ARCHIV ),然后从事件表删除原始条目。
已归档的事件包括成功处理的事件、处理过但由于错误而终止的事件和未预订的事件。每个事件都具有一个状态,该状态可以指示以下其中一种情况:
在 SAP 应用程序中使用 IBM CROSSWORLDS 连接器工具来管理事件归档表。连接器工具使管理员能够显示和截断归档表并重新提交事件进行处理。有关维护归档表和设置日志截断的更多信息,请参阅管理 ABAP 扩展模块。
连接器是由事件驱动的。要从 SAP 应用程序获取事件,您需要为每个 IBM WebSphere 支持的业务对象实现事件触发机制。连接器的事件触发由三个功能组成:
事件检测是标识在 SAP 应用程序中生成了事件的过程。连接器通常使用数据库触发器来检测事件。但是,因为 SAP 应用程序与 SAP 数据库紧密集成,所以 SAP 只具有非常有限的访问权来直接修改其数据库。因此,将在数据库上的应用程序事务层中实现事件检测机制。
IBM WebSphere Business Integration mySAP.com 适配器通常使用三种机制来在 SAP 应用程序中检测事件:
无论使用哪种检测机制,都将使用事件触发器 Y_XR_ADD_TO_QUEUE 来触发所有事件。一旦事件由一种检测机制标识,则将把该事件将传递至事件触发器。IBM WebSphere Business Integration mySAP.com 适配器包括一个将事件提交至事件表(YXR_EVENTS)的事件触发器(Y_XR_ADD_TO_QUEUE)。特别是,它为表示事件的对象名、查询描述和键添加一行数据。
所有事件将使用 Y_XR_ADD_TO_QUEUE 添加将至当前事件表。除了将一行数据添加至 YXR_EVENTS 之外,还可以为以下各项设置 Y_XR_ADD_TO_QUEUE:
事件过滤、事件分布和事件优先级将作为事件触发器的一部分执行,而不需要通过其它任何程序来执行。它们导致出现了事件的限制(过滤)或修改(事件分布和事件划分优先级)。
图 68 举例说明了 SAP 应用程序内的事件触发功能。事件 E1、E2 和 E3 由事件触发器 Y_XR_ADD_TO_QUEUE 接收。E1 表示“客户”事件,E3 表示“订单”事件。事件分布设置为由 SAPconnector1 处理所有“客户”对象,由 SAPconnector2 处理所有“订单”对象。在此环境中,两个连接器都使用同一集成代理程序。因为 E1 是“客户”对象,所以它由 SAPconnector1 轮询;因为 E3 是“订单”对象,所以它由 SAPconnector2 轮询。E2 是“库存”对象,用于限制库存对象的限制程序 YXRRESTR 中的代码将该对象从工厂 100 中过滤掉。
图 68. 使用功能模块 Y_XR_ADD_TO_QUEUE 的事件触发
注意: 如果您使用多个连接器进行轮询,则您必须将每个预订的事件用在特定连接器上。不这样做可能会导致传递重复事件。您必须保证专用于不同连接器的对象之间没有相关性,因为这可能导致不按顺序传递事件。
例如,假定您具有名为 CROSSWORLDS1 的单个集成代理程序,该集成代理程序预订了两个不同的业务对象 BO_A 和 BO_B。BO_A 业务对象较小,因此可以快速检索,而 BO_B 较大,因此需要更长的时间来检索。使用两个连接器轮询 SAPconnector1 和 SAPconnector2,您可以设置事件分布表,以便 SAPconnector1 检索 BO_A,SAPconnector2 检索 BO_B。SAPconnector1 可以连续轮询类型为 A 的小对象,而 SAPconnector2 主要用于类型为 B 的较大对象。
缺省情况下,所有事件都获得优先级零。将在与事件分布相同的 ABAP 表中配置对象的优先级。
一旦事件触发器将事件插入事件表,就会将事件提交至数据库并设置其事件分布和事件优先级值。此时,只有轮询才能修改该事件。当完成事件轮询进程时(这意味着已从 SAP 应用程序检索该事件并由连接器的 Java 组件处理它),将把已处理的事件的副本添加至事件归档表(YXR_ARCHIV)。然后将从事件表删除原始事件。