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. maven之详解继承与聚合

    说到聚合与继承我们都很熟悉,maven同样也具备这样的设计原则,下面我们来看一下Maven的pom如何进行聚合与继承的配置实现. 一.为什么要聚合? 随着技术的飞速发展和各类用户对软件的要求越来越高, ...

  2. (一)MII/MDIO接口详解

    本文主要分析MII/RMII/SMII,以及GMII/RGMII/SGMII接口的信号定义,及相关知识,同时本文也对RJ-45接口进行了总结,分析了在10/100模式下和1000M模式下的设计方法. ...

  3. 键盘控制div移动

    <!DOCTYPE html><html lang="zh-CN"><head> <meta charset="UTF-8&qu ...

  4. Machine Learning - 第3周(Logistic Regression、Regularization)

    Logistic regression is a method for classifying data into discrete outcomes. For example, we might u ...

  5. [转]Android 5.0——Material Design详解(动画篇)

    Material Design:Google推出的一个全新的设计语言,它的特点就是拟物扁平化. Material Design包含了很多内容,今天跟大家分享一下Material新增的动画: 在Andr ...

  6. 使用node js 操作 Mysql 数据库

    使用node js 操作 Mysql 数据库 http://www.nodejs.org/ //node js 数据库操作 MySQL //使用https://github.com/felixge/n ...

  7. java 集合(set)

    Interface ListIterator<E> 特有的方法: hasPrevious() 判断是否存在上一个元素. previous() 当前指针先向上移动一个单位,然后再取出当前指针 ...

  8. java 多线程8(join)

    join():  加入.一个线程如果执行了join语句,那么就有新的线程加入,执行该语ij 句的线程必须要让步给新加入的线程先完成任务,然后才能继续执行. import java.util.Scann ...

  9. noip2016赛后总结

    面前并不是一颗变质的心. 只是一种综合并适应一切的情怀. 这或许是最好的心态... 今年的noip貌似考得好不理想呢...彻底挂了... gjs580,hgr555. 一个初三学弟570,一个400+ ...

  10. 【EasyX】RGB to Gray

    code: #include <graphics.h> #include <conio.h> void main() { initgraph(, ); // 读取图片 load ...