ABAP 扩展模块提供的大多数功能都在 SAP 应用程序内部执行。对于每个连接器必须实现的大多数虚拟功能,SAP 应用程序中存在一个对应的 ABAP 功能模块。但是,由于 SAP 不提供支持 init()、doVerbFor() 和 pollForEvents() 方法的特定需求的 ABAP 功能模块,因此这些功能模块是作为连接器模块的一部分开发和交付的。虽然 Java 组件提供了某些功能,但处理这些方法的主要工作由 SAP 应用程序中的 ABAP 组件来完成。
表 39 显示连接器模块实现的虚拟 Java 方法及其相应的 ABAP
组件。记住,这并不是连接器使用的 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 举例说明了业务对象处理。
在连接器模块的 Java 组件中,单个业务对象处理程序实现的 doVerbFor() 方法处理来自集成代理程序的所有业务对象请求以及来自 pollForEvents() 方法的所有业务对象事件。在任一情况下,doVerbFor() 以下列方式执行:
doVerbFor() 方法将业务对象数据传递至功能模块 /CWLD/RFC_DO_VERB_NEXTGEN,然后根据返回的业务对象数据创建一种全新的业务对象结构。
在连接器模块的 ABAP 组件中,连接器的 ABAP 功能模块 /CWLD/RFC_DO_VERB_NEXTGEN 负责SAP 应用程序中的所有 WebSphere 业务对象处理。特别是,它将业务对象数据传递至适当的 ABAP 处理程序。从这种意义上来说,可以认为功能模块 /CWLD/RFC_DO_VERB_NEXTGEN 是一个业务对象路由器。它按下列方式执行:
/CWLD/RFC_DO_VERB_NEXTGEN 使用 ABAP 处理程序来完成每种对象类型和特定于查询描述的请求。/CWLD/RFC_DO_VERB_NEXTGEN 使用业务对象的特定于应用程序的查询描述信息中值来确定要调用哪个 ABAP 处理程序。它还会检查归档状态。可以认为 /CWLD/RFC_DO_VERB_NEXTGEN 是从 doVerbFor() 方法至 ABAP 处理程序的路由器。
ABAP 处理程序是连接器模块所独有的,这些处理程序从连接器模块的 Java 组件扩展业务对象处理程序功能。ABAP 处理程序以 ABAP 功能模块的形式驻留在 SAP 应用程序中并直接与 /CWLD/RFC_DO_VERB_NEXTGEN 通信。将业务对象数据输入或输出 SAP 应用程序数据库需要 ABAP 处理程序。
图 66 举例说明了 ABAP 扩展模块的业务对象处理组件及这些组件的相互关系。注意,对于单个业务对象处理程序(doVerbFor())和业务对象路由器(/CWLD/RFC_DO_VERB_NEXTGEN),存在多个 ABAP 处理程序。
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() 方法的事件通知进程。
连接器的事件通知由两个功能组成:
事件轮询由 pollForEvents() 方法执行的三个功能组成:
事件请求是在 SAP 应用程序中从事件表轮询和检索事件的过程。Java 组件的事件请求机制在 SAP 应用程序中具有一个对应的功能模块 /CWLD/RFC_EVENT_REQUEST。此功能从连接器的 ABAP 事件表 /CWLD/EVT_CUR 检索事件。
每个触发的事件进入事件表时,初始状态为预排队(在事件表中标记为 P 的状态),缺省事件优先级为 0。必须将事件的状态更改为已排队(事件表中的 Q),然后才能处理事件。在连接器检索事件所表示的完整对象之前,事件的优先级必须为 0。有关事件优先级的更多信息,请参阅***。
如果对创建事件和事件键的用户组合不存在数据库锁定,则该事件的状态从预排队更改为已排队。从事件表中检索事件之后,事件的状态更新为“已检索事件”(事件表中的 R)。如果锁定存在,则事件的状态将设置为“已锁定”(事件表中的 L)并且将把该事件重新排队。ABAP 常量 C_MAXIMUM_REQUEUE 定义可以将事件重新排队的次数。如果达到最大次数(缺省为 100),则将把该事件归档至事件归档表。
在预处理所有预排队的事件之后,ABAP 功能模块 /CWLD/RFC_EVENT_REQUEST 选择要返回至连接器模块的 Java 组件中事件请求方法的事件(只能选择状态为已排队的事件)。特定于连接器的配置属性 PollQuantity(缺省为 20)确定为单个轮询返回的最大事件数。有关更多信息,请参阅附录 A, 快速步骤。
事件请求机制分两步执行事件选择过程:
这些事件将专用于事件分布表(/CWLD/EVT_DIS)中的特定集成代理程序。在此表中指定的集成代理程序的名称必须与在启动连接器的快捷方式中指定的名称匹配。例如,在 Windows 上运行的 SAP 连接器的标准快捷方式具有以下格式:
...\start_SAP.bat SAPconnectorName integrationBrokerName -cConfigFileName
当 WebSphere MQ Integrator 是集成代理程序时,WebSphere Business Integration 系统通过从连接器的启动命令中获取值来标识在事件分布表中指定的集成代理程序:
例如,如果特定于连接器的配置属性 PollQuantity 保持在 20,并且有 8 个事件专用于特定连接器和集成代理程序,则该机制选择其它 12 个事件。
当 WebSphere MQ Integrator 是集成代理程序且只配置了一个队列管理器时,队列的名称对于集成代理程序的每个实例必须是唯一的。当 WebSphere MQ Integrator 是集成代理程序且只配置了一个集群时,队列的名称对于集群内的每个集成代理程序必须是唯一的。
如果愿意,您可以将代理程序的名称(在启动命令的 integrationBrokerName 参数中指定)或连接器的名称合并为队列的名称。例如,如果两个代理程序命名为 WMQI1 和 WMQI2,则其各自的 ADMINOUTQUEUE 可能分别命名为 ADMINOUTQUEUE_MQI1 和 ADMINOUTQUEUE_MQI2。
事件请求功能根据 /CWLD/EVT_CUR 事件表生成一组要处理的事件。该功能将这些事件传递至事件处理功能,事件处理功能按以下方式每次处理一个事件:
如果事件不在预订列表中,则将事件的状态设置为未预订。
有关为事件指定组合键的更多信息,请参阅编写组合键作为名称-值对。
在事件请求处理了每个事件之后,将使用功能模块 /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 应用程序中检测事件:
所有这些事件检测机制都支持对象的实时触发和检索。另外,代码增强和批处理程序都提供了功能来延迟事件的检索。其检索被延迟的事件被称为将来的事件。有关触发将来的事件的更多信息,请参阅事件触发。
记住,这些只是事件检测机制的一些示例。检测事件有许多不同的方式。
一旦事件由其中一种事件检测机制标识,就会使用适配器提供的其中一个事件触发器来触发它。
如果将实时触发事件,则 /CWLD/ADD_TO_QUEUE 将把事件提交给当前事件表(/CWLD/EVT_CUR)。特别是,它为表示事件的对象名、查询描述和键添加一行数据。
图 68 举例说明由 /CWLD/ADD_TO_QUEUE 触发的事件。
如果需要在将来某个日期处理某个事件,则 /CWLD/ADD_TO_QUEUE_IN_FUTURE 将把该事件提交给将来事件表(/CWLD/EVT_FUT)。特别是,它为表示事件的对象名、查询描述和键添加一行数据。另外,它会添加一个“日期”行,将由适配器提交的批处理程序 /CWLD/SUBMIT_FUTURE_EVENTS 来读取该行。可以安排此批处理程序从将来事件表中检索事件。一旦它检索了事件,它就会调用 /CWLD/ADD_TO_QUEUE 来将事件触发到当前事件表中。
图 69 举例说明由 /CWLD/ADD_TO_QUEUE_IN_FUTURE 触发的事件。
图 69. /CWLD/ADD_TO_QUEUE_IN_FUTURE
有关为将来事件表触发事件的更多信息,请参阅为 ABAP 扩展模块开发事件检测。
所有事件都使用 /CWLD/ADD_TO_QUEUE 添加至当前事件表。除了将一行数据添加至当前事件表之外,还可以为以下各项设置 /CWLD/ADD_TO_QUEUE:
事件过滤、事件分布和事件优先级将作为事件触发器的一部分执行,而不需要通过其它任何程序来执行。它们导致出现了事件的限制(过滤)或修改(事件分布和事件划分优先级)。
注意: 如果您使用多个连接器进行轮询,则您必须将每个预订的事件用在特定连接器上。不这样做可能会导致传递重复事件。您必须保证专用于不同连接器的对象之间没有相关性,因为这可能导致不按顺序传递事件。
例如,假定您具有名为 CrossWorlds1 的单个集成代理程序,该集成代理程序预订了两个不同的业务对象 BO_A 和 BO_B。BO_A 业务对象较小,因此可以快速检索,而 BO_B 较大,因此需要更长的时间来检索。使用两个连接器轮询 SAP1connector 和 SAP2connector,您可以设置事件分布表,以便 SAP1connector 检索 BO_A,SAP2connector 检索 BO_B。SAP1connector 可以连续轮询类型为 A 的小对象,而 SAP2connector 主要用于类型为 B 的较大对象。
缺省情况下,所有事件都获得优先级零。将在与事件分布相同的 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)。然后将从事件表删除原始事件。