1. 应用背景

某汽车制造企业(以下称为厂商A)与其仓储系统提供商(以下称为厂商B)需要进行数据交换。汽车厂商A使用SAP系统作ERP管理,所有数据都要进入SAP进行处理,仓储系统提供商使用的是自有的系统。目前数据交换的办法是,由B自己开发程序将数据输出为标准的IDoc文件,然后通过远程文件传输系统传输到A,A自己利用SAP JCo (Java Connector) 调用EDI接口把文件输入到SAP系统中。这些IDoc文件以时间戳来排序,要求严格按照时序来进入SAP系统,即必须在上一个处理完成之后再进行下一个。原因在于提货数据依赖于入库数据,必须先入库,才能提货,否则会出错。

为了解决传输稳定性和时序问题,首先引进了MQ。通过MQ作为排队和传输通道,A和B各开发发送和接收客户端,很好的保证了消息的可靠传输和时序问题。但这种实现方式,存在的问题是需要厂商自己开发维护程序,一旦IDoc消息有改动,必须修改两端的程序,两个应用被紧耦合在一起。所以考虑使用Message Broker和SAP Adapter 来实现该功能。

Message Broker利用MQ作为传输机制,同时可以对消息进行解析和转换。这样B厂商的发送端程序不需要做改动,只要在Message Broker中将IDoc 消息转换为Adapter 需要的BO 消息。对于 SAP Adapter 来说,要求的始终都是BO消息,不必理会发送端到底送出的是什么消息。

本文重点介绍在这样场景下SAP adapter的使用和配置而不涉及Message Broker。


回页首

2. SAP Adapter简介

SAP Adapter 是WBI Adapter家族中的一员,其架构如下图所示:

SAP Adapter是Broker和SAP应用系统之间进行通讯的桥梁,使数据可以在SAP系统和Integration Broker 之间双向交换。

在使用Message Broker作为broker的情况下,SAP Adapter 和Broker之间通过JMS方式来进行通讯,即使用消息队列。Broker和Adapter使用业务对象(Business Object简称为BO)这种WBI框架内定义的消息格式作为数据交换的标准格式,每一种类型BO都由相应的XML schema文件来定义。Broker将BO消息放入Request 队列,Adapter监听该队列并通过SAP系统处理得到的消息,根据配置决定是否返回给Broker处理结果(同样也是通过消息队列)。SAP Adapter还可以监听SAP系统中的事件,并把该事件转换为BO消息通过队列传递给Broker。

SAP Adapter 通过SAP JCo (SAP Java Connector)提供的API来与SAP 进行通信,通过调用SAP的各种RFC(Remote Function Call)接口来实现不同的功能模块。SAP Adapter提供了5种模块可供选择:

SAP Adapter 通过SAP JCo (SAP Java Connector)提供的API来与SAP 进行通信,通过调用SAP的各种RFC(Remote Function Call)接口来实现不同的功能模块。SAP Adapter提供了5种模块可供选择:

  • ALE--通过SAP的ALE 功能,实现Adapter和SAP系统之间IDoc的双向传输。本质上是一个面向批量数据处理,只支持异步的模块。
  • BAPI--提供对各种BAPI包括RFC的同步调用,只支持从Adapter到SAP系统的调用。
  • HDR--提供对SAP系统表数据的直接访问。
  • RFCServer--Adapter可以作为一个RFC Server,在SAP系统中可以用ABAP来远程同步调用Adapter支持的RFC,从而可以支持由SAP系统发起的需要外部程序响应的情况。
  • Extension--用ABAP在SAP中对应实现了Adapter的各个接口,可以定义自己的事件类型,支持双向通讯。但需要在SAP部署定制的ABAP程序。

回页首

3. SAP Adapter 的配置

在配置SAP Adapter前,首先要确定使用哪几个模块(SAP Adapter可以支持同时使用多种模块!),在本文的应用背景下,可以考虑ALE,BAPI和Extension三种模块。ALE Outbound (从Adapter到SAP)是通过调用SAP的两个RFC函数:IDOC_INBOUND_ASYNCHRONOUS(4.X 版本的IDoc)或IDOC_INBOUND_PROCESS(3.x版本的IDoc)来实现的。由于这两个函数没有返回值,所以ALE模块本质上只支持异步操作,显然不适合应用的要求。Extension 模块能实现同步调用,但是需要在SAP系统中作定制和一定的开发,比较繁琐。BAPI模块可以调用各种RFC,同时保证同步调用,我们只要找到相应的同步处理IDoc的RFC函数即可,而SAP确实提供了这样的接口:IDOC_INBOUND_SYNCHRONOUS(3.x IDoc)和IDOC_INBOUND_SINGLE(4.x IDoc)。因此,这里选用了BAPI模块。

选用BAPI模块还有额外的好处:第一,如果使用ALE模块,SAP Adapter需要为每种IDoc的类型来生成BO Schema,也就是说,每增加不同的IDoc类型,则需要重新生成BO Schema。而直接使用BAPI模块,调用的函数可以处理任何类型的IDoc ,所以只需要一次配置,特别是在B厂商提供的是标准的IDoc文件的情况下,IDoc文件和SAP 提供接口之间的对应关系比特定的IDoc类型之间的关系简单,这样使得Broker的解析工作变得更加简单。第二,BAPI模块只支持从Adapter到SAP系统的单向操作,所以它的配置是最简单的。

要使Adapter 工作,需要作两件事:

1.生成BO的定义。

BO是Adapter所需要的消息格式,由XML Schema来定义。SAP Adapter提供了一个称为ODA(Object Discovery Agent)的工具,用户无需手工编写Schema,只要通过BO 设计器来访问ODA,按照向导来选择对应的原数据如IDoc类型、RFC函数名等,ODA会自动根据系统内的定义生成相应的BO Schema。

ODA和BO 设计器是通过Client/Server方式来协同工作的。首先要启动ODA,下图为ODA 启动后的情况:

然后使用BO 设计器连接到ODA,跟随向导来一步步生成BO。下图为BO 生成向导中的一屏,在这里用户可以选择需要生成BO的元数据。在BAPI的情况下,需要选的数据是一个RFC接口的定义,可以在RFC根节点下通过名字来查找名为IDOC_INBOUND_SYNCHRONOUS以及IDOC_INBOUND_SINGLE。如下图,找到后选中这两个节点,完成下面的步骤即可生成相应的BO schema文件。

生成后的BO可以在BO 设计器中查看和编辑,如下图所示:

以上BO定义中的各条属性对应了IDOC_INBOUND_SINGLE接口中的各个参数,而IDoc文件中的数据都可以映射到这些参数,这样IDoc文件中的数据就被转换成RFC调用中的参数传递给了SAP系统进行处理。这里的对应非常直接,所以转换并不是一项非常困难的工作。

2.配置Adapte。Adapter运行时需要指定相应的配置文件。通过适配器配置工具可以生成配置文件。

在本文的应用中,需要保证消息处理的时序性,所以只能通过单线程操作。相应的需要将Adapter配置为单线程:

从消息队列里取消息时,使用单线程,则配置jms.NumConcurrentRequests = 1:

以单线程将IDoc送到SAP并处理,即以单线程调用相应的RFC,则配置MaxNumberOfConnections=1:

SAP Adapter可以支持多种BO 定义,只要它们都加到配置文件中:

生成配置文件和BO定义后,我们就可以启动Adapter了。启动后的Adapter控制台如下所示


回页首

4. 测试

启动Adapter后,通过程序向Request 队列按顺序发送4000条从对应IDoc生成的BO 消息。Adapter成功的处理了所有的消息,无遗漏,无错误。由于单线程操作,处理速度稳定在2 message/ sec 左右。在每次处理中,远程调用花费时间200ms左右,其他BO转换花费300毫秒左右。


回页首

5. 小结

使用Adapter代替自己开发程序有很多好处。首先,不必维护复杂的代码, 只需要维护一个配置文件和几个BO schema文件,而且都有图像化的工具来辅助。其次,具有多种可配置的属性,比如如果将来不需要保证时序,而要求提高性能,那么只要改动配置文件使Adapter多线程工作即可。第三,适应性和扩展性好,如果将来需求有变化,比如要调用新的RFC函数,那么只要重新生成BO schema即可,要变成双向通讯,只要在配置中添加ALE等模块即可。

总之,使用SAP Adapter是可以实现IDoc的同步交换的,并且比手工编码实现有更好的扩展性。虽然就事论事,第一节提到的应用场景用手工编码的方式更简单。但是在日新月异的今天,未雨绸缪,使用Adapter 可以更好的适应不断变化的企业流程和不断丰富的需求。

使用WBI SAP Adapter 实现IDoc的同步处理(转)的更多相关文章

  1. BizTalk Server 2016配置 WCF SAP Adapter

    BizTalk Server 2016配置 WCF SAP Adapter 最近公司内部需要使用BizTalk与SAP 系统进行对接,虽然SAP/PI可以以发布WebService 的方式实现与外部系 ...

  2. SAP Adapter启动报错

    在启动Adapter的时候,抛出GateWay Service Exception 当时用的gateway service是“sapgw00” 解决方法:这是由于当sap系统向本机注册服务的时候出错, ...

  3. SAP CRM和C4C数据同步的两种方式概述:SAP PI和HCI

    SAP Cloud for Customer(C4C)和SAP其他传统产品进行数据同步的方式,如下图所示,可以使用SAP Netweaver Process Integration或者SAP HANA ...

  4. 033.SAP上查看IDOC接口,PI接口查不到的日志记录,可能在IDOC接口日志里面

    01. SAP系统发料之后,数据没有传输到条码系统,同事也没有任何bc01的日志,这是就要考虑是不是在IDOC接口了,输入事务代码WE02或者WE05 02.双击查看内容 03.点开就能看到详细内容了 ...

  5. ABAP开发顾问必备:SAP ABAP开发技术总结

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. idoc 和 bapi 和 rfc 之间的区别

        se37 写出来的叫function,其中可以远程调用的叫rfc,remote-enabled function,abap语法和输入输出参数就会有一些限制.bapi是sap做好的实现特定业务操 ...

  7. ABAP开发顾问必备:SAP ABAP开发技术总结[转载]

    转载自SAP师太技术博客,原文链接:http://www.cnblogs.com/jiangzhengjun/p/4260224.html 在原文上增加了链接,此文及此文的链接版权都归SAP师太所有. ...

  8. How to : SAP PI Cache Refresh

    Requirement : Identify various tools/resources available to perform SAP PI Cache refresh . Please no ...

  9. 开源数据同步神器——canal

    前言 如今大型的IT系统中,都会使用分布式的方式,同时会有非常多的中间件,如redis.消息队列.大数据存储等,但是实际核心的数据存储依然是存储在数据库,作为使用最广泛的数据库,如何将mysql的数据 ...

随机推荐

  1. [转载] nosql 数据库的分布式算法

    原文: http://juliashine.com/distributed-algorithms-in-nosql-databases/ NoSQL数据库的分布式算法 On 2012年11月9日 in ...

  2. Mysql ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA

    ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declar ...

  3. JAVA使用POI读取EXCEL文件的简单model

    一.JAVA使用POI读取EXCEL文件的简单model 1.所需要的jar commons-codec-1.10.jarcommons-logging-1.2.jarjunit-4.12.jarlo ...

  4. Python 命令行参数和getopt模块详解

    有时候我们需要写一些脚本处理一些任务,这时候往往需要提供一些命令行参数,根据不同参数进行不同的处理,在Python里,命令行的参数和C语言很类似(因为标准Python是用C语言实现的).在C语言里,m ...

  5. Object Pascal 语法之异常处理

    http://www.cnblogs.com/spider518/archive/2010/12/30/1921298.html 3 结构化异常处理 结构化异常处理(SHE)是一种处理错误的手段,使得 ...

  6. poj2975(nim游戏取法)

    求处于必胜状态有多少种走法. if( (g[i]^ans) <= g[i]) num++; //这步判断很巧妙 // // main.cpp // poj2975 // // Created b ...

  7. Kafka文件的存储机制

    Kafka文件的存储机制 同一个topic下有多个不同的partition,每个partition为一个目录,partition命名的规则是topic的名称加上一个序号,序号从0开始. 每一个part ...

  8. 为什么删不掉date模块

    显示是field pending deletion一看report里面的field list并没有xxx_date_xxx,只好跑到数据库才看到一个field_date_test当时并没有把这个字段当 ...

  9. OpenCV3编程入门笔记(1)图像载入、显示、保存、变换灰度图

    图像载入.显示.保存函数: 1         图像载入函数:imread()   Mat imread(const string& filename, int flags=1); const ...

  10. Docker 使用指南 (一)—— 基本操作

    版权声明:本文由田飞雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/98来源:腾云阁 https://www.qcloud ...