运行 ALE 模块

在处理应用程序事件时,ALE 模块接收 SAP 应用程序推送至连接器的事件。当处理请求时,ALE 模块接收来自集成代理程序的业务对象请求并将它们发送至 SAP 应用程序。

初始化和终止

init() 方法通过 SAP 网关打开与 SAP 应用程序的 RFC 连接。如果连接器未能初始化,则它使用 terminate() 方法来终止该连接。连接器通过与 SAP 网关断开连接来终止。

当处理应用程序事件或业务对象请求时,连接器的初始化进程执行以下任务:

  1. 向 SAP 网关注册在 RfcProgramID 连接器配置属性中指定的程序标识。有关将程序标识设置为 TCP/IP 端口的信息,请参阅向 SAP 网关注册 RFC 服务器模块
  2. 打开与为连接器配置的队列的 MQSeries 会话。
  3. 验证是否已创建进行事件和请求处理所必需的 MQSeries 队列。如果尚未创建它们,则该进程将终止连接器。

因为连接器支持多线程,所以当 ALE 模块处理来自集成代理程序的请求时,该模块使用 SAP 的 Java 连接器(SAPJCo)连接池来执行这种处理。

重要提示:
当您使用 ALE 模块来处理应用程序事件时,需要进行连接器轮询以正确地初始化该模块(以在服务器上安装 RFC 功能)以及为了该模块正确地管理错误。因此,不要将 PollFrequency 属性值设置为 keyno。在您已验证连接器的日志显示安装了必需的 RFC 功能部件之前,不允许 SAP 应用程序将事件触发至连接器。

处理业务对象

将通过事件处理或请求处理来启动 ALE 模块对 SAP 的 WebSphere 业务对象的处理。

当从 SAP 的 Java 连接器(SAPJCo)API 返回业务对象数据时,ALE 模块以下列格式接收 DATS 和 TIMS 字段的值:对于 DATS 数据元素,该格式为 YYYY-MM-DD (包括连字号);对于 TIMS 数据元素,该格式为 HH:mm:ss(包括冒号)。大写的 HH 表示 24 小时制时间,而不是 12 小时制时间。当处理事件时,ALE 模块更改这些格式以适合其相应业务对象属性的 8 个字符和 6 个字符的最大大小。连接器通过从日期数据除去连字号和从时间数据除去冒号来缩短值的长度。

事件处理

SAP 应用程序中两个 RFC 支持功能启动 ALE 模块的所有事件处理。ALE 用于事件处理的业务对象处理程序支持功能 idoc_inbound_asynchronousinbound_idoc_process

当处理事件时,此业务对象处理程序将业务对象持久地存储在 MQSeries 队列中。连接器保留与 RFC 调用相关的事务标识(TID)以保证将每段数据传递一次且仅传递一次。

重要提示:
单个 RFC 调用可以发送一个或多个 IDoc 的数据。因此,MQSeries 队列可以包含一条表示多个 IDoc(每个都表示一个业务对象)的 JMS-MQ 消息。每个 RFC 调用都与单个 TID 相关。

处理 MQSeries 队列中的事件

图 51 举例说明了 ALE 模块如何处理 MQSeries 队列。

图 51. 业务对象事件处理


ALE 模块的业务对象事件处理以下列方式执行:

  1. RFC 功能将事件数据推送至 SAP 网关,侦听器线程在该网关处选取事件。该线程检查与事件相关的 TID 以确定该 TID 的 JMS-MQ 消息是否存在:
  2. 侦听器线程实例化 ALE 事件处理业务对象处理程序,该处理程序从 SAP 网关检索 RFC 接口数据。
  3. 业务对象处理程序将每个事务都格式化为一条 JMS-MQ 消息,将该消息持久地存储在由 SAPALE_Wip_Queue 配置属性指定的队列中。

    每条 JMS-MQ 消息都表示单个 RFC 调用。每个 RFC 调用都可以表示与单个 TID 相关的一个或多个业务对象。连接器将 TID 存储在消息的 CorrelationID 属性中,并将 TidStatus 设置为 CREATED,然后将 IDocProcessStatus 设置为 unknown。连接器使用消息体来存储 IDoc 数据。

    对于大对象,连接器会将对象分成多条消息,以便启用更高效的处理。有关如何启用此支持的详细信息,请参阅事件处理组件表 20

  4. 在每个事务完成之后,连接器更改 TidStatus 的值,并将确认发送回 SAP 以指示事务已完成。在 SAP 接收到确认之后,它从 SAP 应用程序除去该 TID 及其相关数据。

    如果 AleUpdateStatus 配置属性求值为 true,则连接器在 SAP 中更新 IDoc 的状态。如果它检索到 IDoc 信息包,则它更新该信息包中所有 IDoc 的状态。有关更多信息,请参阅在 SAP 中更新 IDoc 状态

  5. 连接器将 JMS-MQ 消息从 WIP 队列移至由 SAPALE_Event_Queue 配置属性指定的队列。
  6. ALE 模块的轮询线程从“事件”队列选取事件消息。
  7. 连接器实例化 ALE 数据处理程序,该数据处理程序将把消息体中数据转换为业务对象以便记入集成代理程序。
  8. 连接器尝试将每个业务对象都记入集成代理程序。如果集成代理程序是 WebSphere Interchange Server,则连接器首先检查是否预订了该业务对象。在处理消息体中的所有业务对象之后,将更新消息的 IDocProcessingStatus 和 BOProcessingStatus,并且将把该消息移至由 SAPALE_Archive_Queue 属性指定的队列。有关 IDocProcessingStatus 的更多信息,请参阅“创建归档消息”;有关 BOProcessingStatus 的更多信息,则请参阅“用于事件和归档处理的 JMS-MQ 消息的结构”。

当从“事件”队列读取消息时,ALE 模块使用 FIFO(先进先出)来维护处理顺序。

重要提示:
连接器轮询是此模块在处理应用程序事件时正确管理错误所必需的。因此,不要将连接器的 PollFrequency 属性值设置为 keyno。在您已验证连接器的日志显示安装了必需的 RFC 功能部件之前,不允许 SAP 应用程序将事件触发至连接器。

重新提交事件

可以使用位于以下目录中的命令行实用程序(对于 Windows 为 BIA_AleEventUtil.bat,而对于 Unix 为 BIA_AleEventUtil.sh)来重新提交已放置在 SAPALE_Unsubscribed_Queue 和 SAPALE_Error_Queue 中的事件:ProductDir/connectors/SAP/utilities/ALEEventUtil/,其中 ProductDir 表示连接器的安装目录。有关更多信息,请参阅用于事件处理的 ALE 模块队列管理实用程序

用于事件和归档处理的 JMS-MQ 消息的结构

表 20 描述连接器发送至“事件”和“归档”队列的消息的结构。

表 20. 用于事件和归档处理的 JMS-MQ 消息的结构
JMS 消息头属性 描述
CorrelationId 连接器根据由 SAP 发送的事务标识(TID)来设置此属性的值。

当将大型 IDoc 分成更小的消息部分时,此属性标识该消息部分与哪个更大的消息有关。连接器将此值设置为集合中的第一部分的 JMSMessageID。注意,第一部分的 CorrelationID 始终是与大型 IDoc 相关联的第一条 JMS-MQ 消息的 CorrelationID。有关将 IDoc 分成更小的消息部分的详细信息,请参阅事件处理组件

JMSMessageID 消息的唯一标识。当将大型 IDoc 分成更小的消息部分时,连接器将除了第一部分之外的所有部分的此属性的值设置为第一部分的 JMSMessageID。有关将 IDoc 分成更小的消息部分的详细信息,请参阅事件处理组件
MutliPartMessage 当将大型 IDoc 分成更小的消息部分时,连接器使用此属性来标识具有更大消息的适当部分的消息。例如,假定将原始的更大 IDoc 消息分成 8 条 JMS-MQ 消息,则每一部分的 MultiPartMessage 属性的值分别为 8 部分中的第 1 部分8 部分中的第 2 部分,依次类推。有关将 IDoc 分成更小的消息部分的详细信息,请参阅事件处理组件
TidStatus 维护 TID 的状态。
IDocProcessStatus 在事件处理期间,维护 IDoc 对象的状态。
BOProcessingStatus 使用格式 <CID> :: <IDoc sequence number><Status symbol> 来维护消息中所有 IDoc 的状态。可能的状态符号为 S(表示成功)、F(表示失败)和 U(表示未预订)。例如,“<CID> :: 0S, 1F, 2U”表示,对于 CorrelationId = <CID>,第一个 IDoc 成功,第二个失败,第三个是未预订的。

表 21 描述在事件移至“归档”队列之后 IDocProcessStatus 属性的可能值。

表 21. IDocProcessStatus 消息属性的归档队列值
IDocProcessStatus 属性值 事件状态 描述
success 成功 在没有错误的情况下记入了消息中的所有业务对象。
partial 部分成功 在有错误的情况下记入了消息中的一个或多个业务对象但不是所有业务对象。如果集成代理程序是 WebSphere Interchange Server,则在有错误的情况下记入了消息中的一个或多个业务对象但不是所有业务对象,或者这些对象是未预订的。
unsubscribed 未预订 如果集成代理程序是 WebSphere Interchange Server,则消息中的所有业务对象都是未预订的。
fail 失败 在有错误的情况下记入了消息中的所有业务对象。

创建归档消息

当将消息从“事件”队列移至“归档”队列时,将更新 IDocProcessingStatus 和 BOProcessingStatus。消息体仍保持不变。

例如,假定连接器处理一条具有 4 个 IDoc 的事件消息,它将每个 IDoc 转换或尝试转换为业务对象,在表 22 中举例说明了结果:

表 22. 归档消息创建
IDoc 或业务对象的状态 产生的归档消息
成功地转换第 1 个 IDoc,并且将该业务对象记入集成代理程序 IDocProcessStatus 更新为 success,并且 BOProcessingStatus 是 <CID> :: 0S
未能将第 2 个 IDoc 转换为业务对象 IDocProcessStatus 更新为 partial,并且 BOProcessingStatus 是 <CID> :: 0S, 1F
成功地转换第 3 个 IDoc,并且将该业务对象记入集成代理程序 IDocProcessStatus 设置为 partial,并且 BOProcessingStatus 是 <CID> :: 0S, 1F, 2S
成功地转换第 4 个 IDoc,但集成代理程序中未预订创建的业务对象
  • IDocProcessStatus 设置为 partial,并且 BOProcessingStatus 是 <CID> :: 0S, 1F, 2S, 3U
  • 在处理最后一个 IDoc 之后,将消息从“事件”队列移至“归档”队列,并将该 IDoc 的 IDocProcessStatus 设置为 partial 以及将 BOProcessingStatus 设置为 <CID> :: 0S, 1F, 2S, 3U

支持用于事件处理的多种消息类型

可以将连接器的同一实例用于引用了同一 IDoc 类型的不同消息类型,但是,每种消息类型需要不同的业务对象定义。要创建不同的业务对象定义,复制并重命名 IDoc 类型的业务对象定义。务必在适当查询描述的查询描述 ASI 中配置正确的 MsgType。

在 SAP 中更新 IDoc 状态

要使连接器在 ALE 模块已检索 IDoc 进行事件处理之后更新标准 SAP 状态码,您必须执行以下操作:

如果 AleUpdateStatus 求值为 true,则连接器将 ALEAUD IDoc 以及状态码信息和描述文本一起发送至 SAP。ALEAUD IDoc 调用 IDOC_INPUT_ALEAUD 功能模块。连接器支持将以下状态码发送至此功能模块:

在以上两种情况中,Business Integration 系统未发送将指示进一步处理的进一步状态码。

有关设置返回 IDoc 状态所必需的特定于连接器的配置属性的信息,请参阅:

有关设置对于返回 IDoc 状态是可选的特定于连接器的配置属性的信息,请参阅:

用于事件处理的 ALE 模块队列管理实用程序

使用此命令行实用程序来维护由 WebSphere Business Integration mySAP.com 适配器(V.5.3.2)的 ALE 模块使用的 MQ 队列。此实用程序重新提交事件消息,将事件消息转储至文件系统以便查看并将消息归档至文件系统。

将在称为事务的工作单元中处理 IDoc。包含多个 IDoc 的 SAP 事务称为事务信息包。适配器通过使用 MQ 消息保存一个或多个 IDoc 来处理事务和事务信息包。适配器将 IDoc 转换为其相应的业务对象。ALE 模块在一个两步骤的进程中处理 IDoc:先是从 SAP 至适配器,然后是从适配器至代理程序。每个步骤将以不同方式处理异常。

有关 MQ 消息的更多信息,请参阅 WebSphere Business Integration 库:http://www.ibm.com/software/integration/wmq/library/。

处理从 SAP 至适配器的 IDoc

如果适配器检测到未预订的或不受支持的业务对象或在 IDoc 传输期间发生任何异常,则适配器将不能执行该 SAP 事务。可以查看失败的事务,并可以从 SAP 事务 SM58 重新提交这些事务。在重新提交该事务之前,解决以下异常:

一旦成功地执行了此步骤,就完成了 SAP 的事务。

重要提示:
要防止重复的事件传递,不要重新提交修正的 IDoc 事务或事务信息包内的各个 IDoc。

处理从适配器至代理程序的 IDoc

如果 MQ 消息包含单个业务对象且该业务对象是未预订的,则将把该 MQ 消息移至未预订队列。事务信息包内每个未预订业务对象都将在未预订队列中作为它自己的 MQ 消息继续存在。原始 MQ 消息保持不变并包含各个 IDoc 的处理状态。一旦处理完 MQ 消息的事务信息包,将把该信息包移至归档队列。

在重新提交该事务之前,解决以下异常:

在完成纠错之后,使用命令实用程序 AleEventUtil 将 MQ 消息移回事件队列,并重新提交该事件:

当 IDoc 包含格式不正确的数据或不包含数据时,将把该 IDoc 移至“错误”队列作为它自己的消息。

安装和配置 ALE 模块队列实用程序

ALE 模块队列实用程序与 SAP 适配器打包在一起。当安装时,它具有以下目录结构:

\Connectors\SAP\BIA_AleEventUtil.jar

\Connectors\SAP\BIA_AleEventUtil.bat

\Connectors\SAP\BIA_AleEventUtil_readme.txt

修改启动脚本文件 BIA_AleEventUtil.bat 以捕获以下参数。要创建本地队列管理器,您只需配置 MQQueueManager
变量 描述 注释
MQQueueManager 队列管理器的名称 必需参数。
MQChannel 服务器连接通道名称 对于访问远程队列管理器是必需的。
MQPort 侦听通道所在的端口 对于访问远程队列管理器是必需的。
MQHost 正在运行队列管理器的主机名或 IP 地址 对于访问远程队列管理器是必需的。
MQUser MQHost 上的有效用户名 对于访问远程队列管理器是必需的。
MQPassword 用户密码 对于访问远程队列管理器是必需的。值是未加密的。

运行 MQ 管理实用程序

在安装并配置该实用程序之后,浏览至安装了 ALE 模块队列管理实用程序的目录。该实用程序的有效命令如下:

-c <choice>(有效的选项为 [move, archive, dump, replicate])

-i <inputq>

-o <outputq>

-f <outputfile>

-d <date>

-u <unique message ID>

-n <replication count>

注:
当存在同名的现有文件时,archive 命令将发生异常,但 dump 命令将覆盖该文件。

要将消息的内容转储到文件,在命令提示符下进入安装了该实用程序的目录并运行以下命令:

BIA_AleEventUtil -cdump -i<QueueName> -f<OutputFileName>

要将消息从一个队列移至另一个队列,运行以下命令。此命令将移动队列中的所有消息:

BIA_AleEventUtil -cmove -i<FromQueue> -o<ToQueue>

要移动单个消息,使用与所需消息的消息标识对应的额外参数 MessageIdByte

BIA_AleEventUtil -cmove -i<FromQueue> -o<ToQueue> -u<MessageIdByte>

要移动等于或早于指定日期的所有消息,添加 Date 参数:

BIA_AleEventUtil -cmove -i<FromQueue> -o<ToQueue> -d<date(YYYYMMDD)>

要将消息从队列归档至文件,并除去等于或早于指定日期的所有消息,则使用以下命令:

BIA_AleEventUtil -carchive -i<QueueName> -f<ArchiveFileName> -d<date(YYYYMMDD)>

请求处理

可视连接器框架使用顶级业务对象的查询描述 AppSpecificInfo 属性的值,来实例化 ALE 请求处理业务对象处理程序。请求处理业务对象处理程序中的 doVerbFor() 方法启动所有业务对象请求。

业务对象处理程序将业务对象数据转换为两个表,这两个表表示 IDoc 格式及其元数据组件(即控制记录)。一旦数据使用 IDoc 格式,则业务对象处理程序对适当的 SAP 功能模块执行 RFC 调用:idoc_inbound_asynchronousinbound_idoc_process。因为 ALE 是异步的,所以连接器不会等待返回响应。

重要提示:
缺省情况下,由 SAPODA 生成的父包装程序业务对象包含 TransactionId 属性。此属性中的值导致连接器在处理服务调用请求时管理 TID。如果您不想对请求处理进行 TID 管理,则不要为此属性设置值。有关更多信息,请参阅父包装程序业务对象
注:
TransactionId 属性的值必须是唯一标识。该值不等于 SAP 应用程序中的 TID 。这些值存储 在一个表中,该表在由 SAPtid_Queue 配置属性指定的队列的 JMS_MQ 消息内。

如果 TransactionId 属性不具有值,则 ALE 模块将请求直接发送至 SAP。如果 TransactionId 属性具有值,则 ALE 模块执行下列操作:

  1. 连接器检查由 SAPtid_Queue 配置属性指定的队列中的 JMS-MQ 消息是否具有此值。
  2. 连接器将业务对象转换为 RFC 表并对 SAP 执行 RFC 调用。
  3. 在 SAP 确认接收到 RFC 调用之后,连接器从表中除去该键、归档该键并将成功状态返回到集成代理程序。

归档

在成功处理服务调用处理之后,将把 SAPtid_Queue 中 JMS-MQ 消息的表中相应条目除去并归档至一个目录。对于 WINNT,将在 \ale\request 子目录中创建文件,对于 Unix 系统,将在 /ale/request 中创建文件。ale 子目录位于启动适配器的目录中。将使用已从表中除去的条目来创建新文件。文件名将具有以下格式:<ObjectID>_<TID><timestamp>.executed,其中 ObjectID 是来自 TransactionId 属性的值,TID 是来自 SAP 的事务标识,而 timestamp 是创建文件时的时间戳记。

适配器本身使用连接器配置属性 ArchiveDays 来管理这些归档文件的删除。连接器配置属性 ArchiveDays 中的值确定这些归档文件将保留在 ale\request 子目录中的天数。将删除超过 ArchiveDays 中指定的天数的任何文件。如果未配置此属性,则 ArchiveDays 的缺省值为 7 天。还可以通过自己删除归档文件来手工管理这些文件。

重新提交失败请求

对于集成代理程序指出的所有失败请求,检查是否为该请求创建了归档文件。如果该请求中的对象标识存在归档文件,则不要从集成代理程序重新提交该请求。如果该 ObjectID 没有归档文件,则重新提交请求。确保 ArchiveDays 连接器配置属性已设置为将允许验证重新提交的请求的值。

用于请求处理的 JMS MQSeries 消息的表中列

表 23 描述连接器从 SAPtid_Queue 获取的 JMS-MQSeries 消息的列:

表 23. 用于请求处理的 JMS-MQ 消息的列
列名 描述
ObjectID 所请求业务对象的 TransactionID 属性中的值。此值用作表键。
TID 从 SAP 获取的事务标识
TidStatus 事务的状态

支持用于请求处理的多种消息类型

对于事件处理,可以使用下列机制:

Copyright IBM Corp. 1997, 2004