ABAP 扩展模块的工作方式

ABAP 扩展模块提供的大多数功能都在 SAP 应用程序内部执行。对于每个连接器必须实现的大多数虚拟功能,SAP 应用程序中存在一个对应的 ABAP 功能模块。但是,由于 SAP 不提供支持 init()doVerbFor()pollForEvents() 方法的特定需求的 ABAP 功能模块,因此这些功能模块是作为连接器模块的一部分开发和交付的。虽然 Java 组件提供了某些功能,但处理这些方法的主要工作由 SAP 应用程序中的 ABAP 组件来完成。

表 38 显示连接器模块实现的虚拟 Java 方法及其相应的 ABAP 组件。记住,此表不提供由连接器使用的 ABAP 组件的完整列表。

表 38. Java 组件及其相应的 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 举例说明了业务对象处理。

图 65. doVerbFor() 的业务对象处理


doVerbFor()

在连接器模块的 Java 组件中,单个业务对象处理程序实现的 doVerbFor() 方法处理来自集成代理程序的所有业务对象请求以及来自 pollForEvents() 方法的所有业务对象事件。在任一情况下,doVerbFor() 以下列方式执行:

  1. 将 SAP 的 WebSphere 业务对象实例转换为包含业务对象数据的单个预定义平面结构。
  2. 调用 ABAP 功能模块 Y_XR_RFC_DO_VERB_NEXTGEN,将业务对象数据传递至该模块,然后等待业务对象数据返回。
  3. 将返回的业务对象数据重新转换为 WebSphere 业务对象。

doVerbFor() 方法将业务对象数据传递至功能模块 Y_XR_RFC_DO_VERB_NEXTGEN ,然后根据返回的业务对象数据创建一种全新的业务对象结构。

Y_XR_RFC_DO_VERB_NEXTGEN

在连接器模块的 ABAP 组件中,连接器的 ABAP 功能模块 Y_XR_RFC_DO_VERB_NEXTGEN 负责SAP 应用程序中的所有 WebSphere 业务对象处理。特别是,它将业务对象数据传递至适当的 ABAP 处理程序。从这种意义上来说,可以认为功能模块 Y_XR_RFC_DO_VERB_NEXTGEN 是一个业务对象路由器。它始终以下列方式执行:

  1. 接收业务对象。
  2. 动态地调用 ABAP 处理程序来处理业务对象数据并以参数形式传递业务对象数据。
  3. 从 ABAP 处理程序接收业务对象数据并将它返回到发出请求的调用。

Y_XR_RFC_DO_VERB_NEXTGEN 使用 ABAP 处理程序来完成每种对象类型和特定于查询描述的请求。Y_XR_RFC_DO_VERB_NEXTGEN 使用特定于应用程序的业务对象查询描述信息中值来确定要调用哪个 ABAP 处理程序。可以认为 Y_XR_RFC_DO_VERB_NEXTGEN 是从 doVerbFor() 方法至 ABAP 处理程序的路由器。

ABAP 处理程序

ABAP 处理程序是连接器模块所独有的,这些处理程序从连接器模块的 Java 组件扩展业务对象处理程序功能。ABAP 处理程序以 ABAP 功能模块的形式驻留在 SAP 应用程序中并直接与 Y_XR_RFC_DO_VERB_NEXTGEN 通信。将业务对象数据输入或输出 SAP 应用程序数据库需要 ABAP 处理程序。

图 66 举例说明了 ABAP 扩展模块的业务对象处理组件及这些组件的相互关系。注意,对于单个业务对象处理程序(doVerbFor())和业务对象路由器(Y_XR_DO_VERB_NEXTGEN),存在多个 ABAP 处理程序。

图 66. 适配器提供的业务对象处理组件


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() 方法的事件通知进程。

图 67. 事件通知进程


连接器的事件通知由两个功能组成:

事件轮询

事件轮询由 pollForEvents() 方法执行的三个功能组成:

注:
这些功能的角色分布在 Java 和 ABAP 组件中。但是,始终是 Java 组件启动事件轮询。

事件请求

事件请求是在 SAP 应用程序中从事件表轮询和检索事件的过程。Java 组件的事件请求机制在 SAP 应用程序中具有一个对应的功能模块 Y_XR_RFC_EVENT_REQUEST。此功能从连接器的 ABAP 事件表 YXR_EVENTS 检索事件。

每个触发的事件进入事件表时,初始状态为预排队(在事件表中标记为 P 的状态),缺省事件优先级为 0。必须将事件的状态更改为已排队(事件表中的 Q),然后才能处理事件。在连接器检索事件所表示的完整对象之前,事件的优先级必须为 0。有关事件优先级的更多信息,请参阅事件优先级

如果对创建事件和事件键的用户组合不存在数据库锁定,则该事件的状态从预排队更改为已排队。如果锁定存在,则事件的状态将设置为“已锁定”(事件表中的 L)并且将把该事件重新排队。ABAP 常量 C_MAXIMUM_REQUEUE 定义可以将事件重新排队的次数。如果达到最大次数(缺省为 100),则将把该事件归档至事件归档表。

注:
每次轮询将更新状态为预排队或已锁定的每个事件。当以批处理方式触发事件时,您可能会遇到性能问题。您可以使用 PollFrequency 配置属性来配置轮询频率。有关更多信息,请参阅附录 D, 连接器的标准配置属性

在预处理所有预排队的事件之后,ABAP 功能模块 Y_XR_RFC_EVENT_REQUEST 选择要返回至连接器模块的 Java 组件中事件请求方法的事件(只能选择状态为已排队的事件)。特定于连接器的配置属性 PollQuantity(缺省为 20)确定为单个轮询返回的最大事件数。有关更多信息,请参阅运行连接器

事件请求机制分两步执行事件选择过程:

  1. 选择专用于连接器和集成代理程序的事件。

    这些事件将专用于事件分布表中的特定集成代理程序。在此表中指定的集成代理程序的名称必须与在启动连接器的快捷方式中指定的名称匹配。例如,在 Windows 上运行的 SAP 连接器的标准快捷方式具有以下格式:

    ...\start_SAP.bat SAPconnectorName integrationBrokerName -cConfigFileName
     

    当 WMQI 是集成代理程序时,WebSphere Business Integration 系统通过从连接器的启动命令中获取值来标识在事件分布表中指定的集成代理程序:

  2. 如果选择的事件数小于最大事件数,则从事件中获取未为事件分布配置的其余事件。

    例如,如果特定于连接器的配置属性 PollQuantity 保持在 20,并且有 8 个事件专用于特定连接器和集成代理程序,则该机制选择没有为事件分布配置的其它 12 个事件。

    当 WMQI 是集成代理程序且只配置了一个队列管理器时,队列的名称对于集成代理程序的每个实例必须是唯一的。当 WMQI 是集成代理程序且只配置了一个集群时,队列的名称对于集群内的每个集成代理程序必须是唯一的。

    如果愿意,您可以将代理程序的名称(在启动命令的 integrationBrokerName 参数中指定)或连接器的名称合并为队列的名称。例如,如果两个代理程序命名为 WMQI1WMQI2,则其各自的 ADMINOUTQUEUE 可能分别命名为 ADMINOUTQUEUE_MQI1ADMINOUTQUEUE_MQI2

    重要提示:
    如果您设置要轮询多个连接器,则必须将每个事件配置为仅由一个连接器进行处理。否则,连接器可能发送重复的事件,或者可能将事件归档而不是检索它们。

事件处理

事件请求功能根据 YXR_EVENTS 事件表生成一组要处理的事件。该功能将这些事件传递至事件处理功能,事件处理功能按以下方式每次处理一个事件:

  1. 使用 object.verb 值来评估事件是否在连接器预订列表中。
  2. 调用 doVerbFor() 并将业务对象数据传递至它。一旦传递了业务对象,事件处理就等待业务对象数据返回。
  3. 根据 doVerbFor() 处理更新事件数组的状态。
  4. 如果已成功检索业务对象数据,则将它传递至集成代理程序。

事件返回

在事件请求处理了每个事件之后,将使用功能模块 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 应用程序中检测事件:

注:
每种事件检测机制都具有优点和缺点,设计和开发业务对象触发器时需要考虑它们。有关实现事件检测机制的更多信息,请参阅为 ABAP 扩展模块开发事件检测
注:
仅有几个事件检测机制示例。检测事件有许多不同的方式。

事件触发器

无论使用哪种检测机制,都将使用事件触发器 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

事件过滤、事件分布和事件优先级将作为事件触发器的一部分执行,而不需要通过其它任何程序来执行。它们导致出现了事件的限制(过滤)或修改(事件分布和事件划分优先级)。

事件过滤
事件触发器可以用来过滤掉您不希望添加至事件表的事件。适配器提供了一个 ABAP 包含程序(YXRRESTR),该程序使您能够为此目的限制特定事件。

事件分布
负载均衡可以用来将事件处理分布在多个连接器上,从而允许您同时处理多个事件。事件触发器通过事件分布表(YXR_EVTDIS)提供此能力。您可以指定一些业务对象专供特定连接器检索。同时,事件分布可以选取单个事件并可以对连接器和集成代理程序的每个预订组合复制事件一次或多次。

图 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 的较大对象。

注:
有关 WebSphere Business Integration 系统如何标识 WMQI 集成代理程序的每个唯一实例的信息,请参阅"事件请求"
重要提示:
如果没有为特定对象配置事件分布表,则为该对象触发的每个事件都可用于连接器和集成代理程序的任何组合。

事件优先级
您可以通过延迟事件检索来为业务对象、连接器和集成代理程序的每个组合设置事件优先级。事件的优先级指示选取事件进行传递之前需要进行的轮询次数。例如,如果您将事件的优先级设置为 10,则连接器在轮询事件表 10 次后才检索事件。每次连接器轮询时,优先级值将减去一,直到达到零为止。

缺省情况下,所有事件都获得优先级零。将在与事件分布相同的 ABAP 表中配置对象的优先级。

事件持久性

一旦事件触发器将事件插入事件表,就会将事件提交至数据库并设置其事件分布和事件优先级值。此时,只有轮询才能修改该事件。当完成事件轮询进程时(这意味着已从 SAP 应用程序检索该事件并由连接器的 Java 组件处理它),将把已处理的事件的副本添加至事件归档表(YXR_ARCHIV)。然后将从事件表删除原始事件。

注:
您可以从归档表重新提交事件。记住,只会将该事件移至事件表,而不会再次触发它。特别是,它不会重新经历事件过滤、事件分布和事件优先级。

Copyright IBM Corp. 1997, 2004