在处理应用程序事件时,ALE 模块接收 SAP 应用程序推送至连接器的事件。当处理请求时,ALE 模块接收来自集成代理程序的业务对象请求并将它们发送至 SAP 应用程序。
当处理应用程序事件或业务对象请求时,连接器的初始化进程执行以下任务:
因为连接器支持多线程,所以当 ALE 模块处理来自集成代理程序的请求时,该模块使用 SAP 的 Java 连接器(SAP JCo)连接池来执行这种处理。
将通过事件处理或请求处理来启动 ALE 模块对 SAP 的 WebSphere 业务对象的处理。
当从 SAP 的 Java 连接器(SAP JCo)API 返回业务对象数据时,ALE 模块以下列格式接收 DATS 和 TIMS 字段的值:对于 DATS 数据元素,该格式为 YYYY-MM-DD (包括连字号);对于 TIMS 数据元素,该格式为 HH:mm:ss(包括冒号)。大写的 HH 表示 24 小时制时间,而不是 12 小时制时间。当处理事件时,ALE 模块更改这些格式以适合其相应业务对象属性的 8 个字符和 6 个字符的最大大小。连接器通过从日期数据除去连字号和从时间数据除去冒号来缩短值的长度。
SAP 应用程序中两个 RFC 支持功能启动 ALE 模块的所有事件处理。ALE 用于事件处理的业务对象处理程序支持功能 idoc_inbound_asynchronous 和 inbound_idoc_process。
当处理事件时,此业务对象处理程序将业务对象持久地存储在 WebSphere MQ 队列中。连接器保留与 RFC 调用相关的事务标识(TID)以保证将每段数据传递一次且仅传递一次。
图 51 举例说明了 ALE 模块如何处理 WebSphere MQ 队列。
ALE 模块的业务对象事件处理以下列方式执行:
每条 JMS-MQ 消息都表示单个 RFC 调用。每个 RFC 调用都可以表示与单个 TID 相关的一个或多个业务对象。连接器将 TID 存储在消息的 CorrelationID 属性中,并将 TidStatus 设置为 CREATED,然后将 IDocProcessStatus 设置为 unknown。连接器使用消息体来存储 IDoc 数据。
对于大对象,连接器会将对象分成多条消息,以便启用更高效的处理。有关如何启用此支持的详细信息,请参阅事件处理组件和表 19。
如果 AleUpdateStatus 配置属性求值为 true,则连接器在 SAP 中更新 IDoc 的状态。如果它检索到 IDoc 信息包,则它更新该信息包中所有 IDoc 的状态。有关更多信息,请参阅在 SAP 中更新 IDoc 状态。
当从“事件”队列读取消息时,ALE 模块使用 FIFO(先进先出)来维护处理顺序。
可以使用位于以下目录中的命令行实用程序(对于 Windows 为 BIA_AleEventUtil.bat,而对于 Unix 为 BIA_AleEventUtil.sh)来重新提交已放置在 SAPALE_Unsubscribed_Queue 和 SAPALE_Error_Queue 中的事件:ProductDir/connectors/SAP/utilities/ALEEventUtil/,其中 ProductDir 表示连接器的安装目录。有关更多信息,请参阅用于事件处理的 ALE 模块队列管理实用程序。
表 19 描述连接器发送至“事件”和“归档”队列的消息的结构
。
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 成功,第二个失败,第三个是未预订的。 |
表 20 描述在事件移至“归档”队列之后 IDocProcessStatus
属性的可能值。
表 20. IDocProcessStatus 消息属性的归档队列值
IDocProcessStatus 属性值 | 事件状态 | 描述 |
---|---|---|
success | 成功 | 在没有错误的情况下记入了消息中的所有业务对象。 |
partial | 部分成功 | 在有错误的情况下记入了消息中的一个或多个业务对象但不是所有业务对象。如果集成代理程序是 WebSphere Interchange Server,则在有错误的情况下记入了消息中的一个或多个业务对象但不是所有业务对象,或者这些对象是未预订的。 |
unsubscribed | 未预订 | 如果集成代理程序是 WebSphere Interchange Server,则消息中的所有业务对象都是未预订的。 |
fail | 失败 | 在有错误的情况下记入了消息中的所有业务对象。 |
当将消息从“事件”队列移至“归档”队列时,将更新 IDocProcessingStatus 和 BOProcessingStatus。消息体仍保持不变。
例如,假定连接器处理一条具有 4 个 IDoc 的事件消息,它将每个 IDoc
转换或尝试转换为业务对象,在表 21 中举例说明了结果:
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,但集成代理程序中未预订创建的业务对象 |
|
要使连接器在 ALE 模块已检索 IDoc 进行事件处理之后更新标准 SAP 状态码,您必须执行以下操作:
如果 AleUpdateStatus 求值为 true,则连接器将 ALEAUD IDoc 以及状态码信息和描述文本一起发送至 SAP。ALEAUD IDoc 调用 IDOC_INPUT_ALEAUD 功能模块。连接器支持将以下状态码发送至此功能模块:
特定于连接器的配置属性 AleSuccessCode 可以具有值 52 或 53。SAP 将此值转换为 41。
特定于连接器的配置属性 AleFailureCode 可以具有值 68。SAP 将此值转换为 40。
在以上两种情况中,Business Integration 系统未发送将指示进一步处理的进一步状态码。
有关设置返回 IDoc 状态所必需的特定于连接器的配置属性的信息,请参阅:
有关设置对于返回 IDoc 状态是可选的特定于连接器的配置属性的信息,请参阅:
使用此命令行实用程序来维护由 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/。
如果适配器检测到未预订的或不受支持的业务对象或在 IDoc 传输期间发生任何异常,则适配器将不能执行该 SAP 事务。可以查看失败的事务,并可以从 SAP 事务 SM58 重新提交这些事务。在重新提交该事务之前,解决以下异常:
一旦成功地执行了此步骤,就完成了 SAP 的事务。
如果 MQ 消息包含单个业务对象且该业务对象是未预订的,则将把该 MQ 消息移至未预订队列。事务信息包内每个未预订业务对象都将在未预订队列中作为它自己的 MQ 消息继续存在。原始 MQ 消息保持不变并包含各个 IDoc 的处理状态。一旦处理完 MQ 消息的事务信息包,将把该信息包移至归档队列。
在重新提交该事务之前,解决以下异常:
在完成纠错之后,使用命令实用程序 AleEventUtil 将 MQ 消息移回事件队列,并重新提交该事件:
当 IDoc 包含格式不正确的数据或不包含数据时,将把该 IDoc 移至“错误”队列作为它自己的消息。
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 | 用户密码 | 对于访问远程队列管理器是必需的。值是未加密的。 |
在安装并配置该实用程序之后,浏览至安装了 ALE 模块队列管理实用程序的目录。该实用程序的有效命令如下:
-c <choice>(有效的选项为 [move, archive, dump, replicate])
-i <inputq>
-o <outputq>
-f <outputfile>
-d <date>
-u <unique message ID>
-n <replication count>
要将消息的内容转储到文件,在命令提示符下进入安装了该实用程序的目录并运行以下命令:
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_asynchronous 或 inbound_idoc_process。因为 ALE 是异步的,所以连接器不会等待返回响应。
如果 TransactionId 属性不具有值,则 ALE 模块将请求直接发送至 SAP。如果 TransactionId 属性具有值,则 ALE 模块执行下列操作:
在成功处理服务调用处理之后,将把 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 连接器配置属性已设置为将允许验证重新提交的请求的值。
表 22 描述连接器从 SAPtid_Queue 中获取的 JMS-WebSphere
MQ 消息的列:
列名 | 描述 |
---|---|
ObjectID | 所请求业务对象的 TransactionID 属性中的值。此值用作表键。 |
TID | 从 SAP 获取的事务标识 |
TidStatus | 事务的状态 |
对于请求处理,同一 SAP 连接器实例可以处理引用同一 IDoc 类型的多种消息类型。尽管事件处理有时要求每种消息类型具有不同的业务对象定义,但是,请求处理允许您对多种消息类型使用同一业务对象定义。
在控制记录对象中设置适当的消息类型(MESTYP)。而且,查询描述对消息类型不起作用,因此,可以将同一业务对象类型用于不同消息类型的不同查询描述。
Verb=Create VerbASI : MsgType=ORDERS; MsgCode=MC01;MsgFunction=MF01
Verb=Update VerbASI : MsgType=ORDERS;MsgCode=MC02;MsgFunction=MF02
Verb=Delete VerbASI : MsgType=ORDERS;MsgCode=MC03;MsgFunction=MF03
注意,两个不同的查询描述不能使用 MsgType/MsgCode/MsgFunction 值的相同组合。
或者,可以使每个查询描述具有不同的消息类型:
Verb=Create VerbASI : MsgType=ORDERS;MsgCode=;MsgFunction=
Verb=Update VerbASI : MsgType=ORDCHG;MsgCode=;MsgFunction=
Verb=Delete VerbASI : MsgType=;MsgCode=;MsgFunction=
Verb ASI for sap_orders_05_ORDERS
Verb=Create VerbASI : MsgType=ORDERS;MsgCode=;MsgFunction=
Verb ASI for sap_orders_05_QUOTES
Verb=Create VerbASI : MsgType=QUOTES;MsgCode=;MsgFunction=