ABAP 扩展模块的工作方式

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

表 39 显示连接器模块实现的虚拟 Java 方法及其相应的 ABAP 组件。记住,这并不是连接器使用的 ABAP 组件的完整列表。

表 39. Java 组件及其相应的 ABAP 组件
Java 组件 ABAP 组件
doVerbFor() /CWLD/RFC_DO_VERB_NEXTGEN
getVersion() 不需要实现
getBOHandlerForBO 不需要实现
init() /CWLD/RFC_LOGON
pollForEvents() /CWLD/RFC_EVENT_REQUEST /CWLD/RFC_EVENT_RETURN
terminate() 不需要实现

这些 ABAP 功能模块合起来就是 ABAP 扩展模块的核心。以下各节描述连接器初始化、业务对象处理和连接器如何处理事件通知。

本章的其余部分中讨论已实现的功能。

初始化

init() 方法调用 ABAP 功能模块 /CWLD/RFC_LOGON,来验证目标 SAP 应用程序是否正在运行以及 RFC 库是否可用于执行 ABAP 功能模块。还要调用 /CWLD/RFC_LOGON 功能模块来处理正在进行的所有事件。事件表中标记有“已检索事件”这种状态(事件表中标记为 R 的一种状态)的所有事件将按照“InDoubtEvents 连接器属性”来进行处理。缺省属性值为“忽略”。当使用事件分布时,只有属于状态为“R”的特定连接器和服务器的事件才将按照连接器属性来进行处理。如果未使用事件分布,则状态为“R”的所有事件都将按照连接器属性来进行处理。如果连接器属性为重新处理,则这些事件将更改为“已排队”这样一种状态(在事件表中标记为 Q)。当连接器轮询事件时,将使用 /CWLD/RFC_EVENT_REQUEST 功能模块来处理状态为“Q”的所有事件。如果连接器属性为 FailOnStartUp,则会将致命错误记录在 SAP 日志中,并且本地日志文件和连接器将关闭。还会发送电子邮件来通知用户已经发生了致命错误。如果连接器属性为 LogError,则会将错误记录在 SAP 日志和本地日志文件中。不会处理正在进行的事件,连接器不会关闭。如果连接器属性为“忽略”,则会忽略正在进行的事件,而连接器将当作事件表中没有任何正在进行的事件来进行轮询。

如果该功能模块未成功执行,则连接器终止。

业务对象处理

SAP 的所有服务调用请求都由连接器模块的 Java 组件中的 doVerbFor() 方法启动。连接器的 ABAP 功能模块 /CWLD/RFC_DO_VERB_NEXTGEN 和连接器模块的 ABAP 组件中 ABAP 处理程序将处理这些请求。

图 65 举例说明了业务对象处理。

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


doVerbFor()

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

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

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

/CWLD/RFC_DO_VERB_NEXTGEN

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

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

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

ABAP 处理程序

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

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

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


ABAP 处理程序负责将业务对象数据添加至 SAP 应用程序数据库(创建、更新或删除),或负责使用业务对象数据作为键来从 SAP 应用程序数据库检索数据(检索)。

适配器提供通用 ABAP 处理程序。例如,功能模块 /CWLD/DYNAMIC_TRANSACTION 支持对平面业务对象执行创建、更新、删除和检索操作。

WebSphere Business Integration 系统提供一个元数据资源库,而适配器提供了一个通用 ABAP 处理程序来支持平面业务对象。适配器还提供了一个 ABAP 处理程序(/CWLD/IDOC_HANDLER)来支持分层业务对象;但是,您必须为您需要支持的每个分层业务对象开发其它特定于业务对象的 ABAP 处理程序。

WebSphere Business Integration 系统提供一些有助于开发过程的工具。有关开发业务对象和 ABAP 处理程序的更多信息,请参阅为 ABAP 扩展模块开发业务对象使用 SAPODA 生成业务对象定义

事件通知

事件通知指一些进程的集合,这些进程将 SAP 应用程序对象事件通知连接器。通知包括(但不限于)事件(对象和查询描述)的类型和外部系统检索相关数据所需要的数据键。

图 67 举例说明了使用 pollForEvents() 方法的事件通知进程。

图 67. 事件通知进程


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

事件轮询

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

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

事件请求

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

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

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

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

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

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

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

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

    ...\start_SAP.bat SAPconnectorName integrationBrokerName -cConfigFileName
     

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

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

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

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

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

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

事件处理

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

  1. 使用 object.verb 值来评估事件是否在连接器预订列表中。

    如果事件不在预订列表中,则将事件的状态设置为未预订

  2. 如果事件在预订列表中,则创建 parentObjectOnly.Retrieve 业务对象。事件处理功能按下列其中一种方式设置键值:

    有关为事件指定组合键的更多信息,请参阅编写组合键作为名称-值对

  3. 调用 doVerbFor() 并将业务对象数据传递至它。一旦传递了业务对象,事件处理就等待业务对象数据返回。
  4. 根据 doVerbFor() 处理更新事件数组的状态。
  5. 如果已成功检索业务对象数据,则将它传递至集成代理程序。

事件返回

在事件请求处理了每个事件之后,将使用功能模块 /CWLD/RFC_EVENT_RETURN 把每个事件返回至 SAP 应用程序。此功能模块生成已处理事件的副本,并将该副本添加至事件归档表(/CWLD/EVT_ARC),然后从事件表删除原始条目。

注:
在处理每个事件之后,将更新具有新状态的所有事件。

已归档的事件包括成功处理的事件、处理过但由于错误而终止的事件和未预订的事件。每个事件都具有一个状态,该状态可以指示以下其中一种情况:

在 SAP 应用程序中使用 IBM WebSphere BI Station 工具来管理事件归档表。IBM WebSphere BI Station 使管理员能够显示和截断归档表并重新提交事件进行处理。有关维护归档表和设置日志截断的更多信息,请参阅管理 ABAP 扩展模块

事件触发

连接器是由事件驱动的。要从 SAP 应用程序获取事件,您需要为每个 IBM WebSphere 支持的业务对象实现事件触发机制。连接器的事件触发由三个功能组成:

事件检测

事件检测是标识在 SAP 应用程序中生成了事件的过程。连接器通常使用数据库触发器来检测事件。但是,因为 SAP 应用程序与 SAP 数据库紧密集成,所以 SAP 只具有非常有限的访问权来直接修改其数据库。因此,将在数据库上的应用程序事务层中实现事件检测机制。

通常使用四种机制来在 SAP 应用程序中检测事件:

所有这些事件检测机制都支持对象的实时触发和检索。另外,代码增强和批处理程序都提供了功能来延迟事件的检索。其检索被延迟的事件被称为将来的事件。有关触发将来的事件的更多信息,请参阅事件触发

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

记住,这些只是事件检测机制的一些示例。检测事件有许多不同的方式。

事件触发

一旦事件由其中一种事件检测机制标识,就会使用适配器提供的其中一个事件触发器来触发它。

注:
这两种功能都用于实时触发。/CWLD/ADD_TO_QUEUE 将立即处理事件,而 /CWLD/ADD_TO_QUEUE 稍后才会处理事件

如果将实时触发事件,则 /CWLD/ADD_TO_QUEUE 将把事件提交给当前事件表(/CWLD/EVT_CUR)。特别是,它为表示事件的对象名、查询描述和键添加一行数据。

图 68 举例说明由 /CWLD/ADD_TO_QUEUE 触发的事件。

图 68. /CWLD/ADD_TO_QUEUE


如果需要在将来某个日期处理某个事件,则 /CWLD/ADD_TO_QUEUE_IN_FUTURE 将把该事件提交给将来事件表(/CWLD/EVT_FUT)。特别是,它为表示事件的对象名、查询描述和键添加一行数据。另外,它会添加一个“日期”行,将由适配器提交的批处理程序 /CWLD/SUBMIT_FUTURE_EVENTS 来读取该行。可以安排此批处理程序从将来事件表中检索事件。一旦它检索了事件,它就会调用 /CWLD/ADD_TO_QUEUE 来将事件触发到当前事件表中。

注:
/CWLD/ADD_TO_QUEUE_IN_FUTURE 填充将来事件表的“日期”行时,它将把系统日期用作当前日期。

图 69 举例说明由 /CWLD/ADD_TO_QUEUE_IN_FUTURE 触发的事件。

图 69. /CWLD/ADD_TO_QUEUE_IN_FUTURE


有关为将来事件表触发事件的更多信息,请参阅为 ABAP 扩展模块开发事件检测

所有事件都使用 /CWLD/ADD_TO_QUEUE 添加至当前事件表。除了将一行数据添加至当前事件表之外,还可以为以下各项设置 /CWLD/ADD_TO_QUEUE

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

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

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

注意: 如果您使用多个连接器进行轮询,则您必须将每个预订的事件用在特定连接器上。不这样做可能会导致传递重复事件。您必须保证专用于不同连接器的对象之间没有相关性,因为这可能导致不按顺序传递事件。

例如,假定您具有名为 CrossWorlds1 的单个集成代理程序,该集成代理程序预订了两个不同的业务对象 BO_A 和 BO_B。BO_A 业务对象较小,因此可以快速检索,而 BO_B 较大,因此需要更长的时间来检索。使用两个连接器轮询 SAP1connector 和 SAP2connector,您可以设置事件分布表,以便 SAP1connector 检索 BO_A,SAP2connector 检索 BO_B。SAP1connector 可以连续轮询类型为 A 的小对象,而 SAP2connector 主要用于类型为 B 的较大对象。

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

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

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

图 70 举例说明了 SAP 应用程序内的事件触发功能。事件 E1、E2 和 E3 由事件触发器 /CWLD/ADD_TO_QUEUE 接收。E1 表示“客户”事件,E3 表示“订单”事件。事件分布设置为由 SAP1connector 处理所有“客户”对象,由 SAP2connector 处理所有“订单”对象。在此环境中,两个连接器都使用同一集成代理程序。因为 E1 是“客户”对象,所以它由 SAP1connector 轮询;因为 E3 是“订单”对象,所以它由 SAP2connector 轮询。E2 是“库存”对象,用于将库存对象限制于特定仓库的限制程序 /CWLD/TRIGGERING_RESTRICTIONS 中的代码已将该对象过滤掉。

图 70. 功能模块 /CWLD/ADD_TO_QUEUE 的事件优先级


事件持久性

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

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

Copyright IBM Corp. 1997, 2004