使用WBI SAP Adapter 实现IDoc的同步处理(转)
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的同步处理(转)的更多相关文章
- BizTalk Server 2016配置 WCF SAP Adapter
BizTalk Server 2016配置 WCF SAP Adapter 最近公司内部需要使用BizTalk与SAP 系统进行对接,虽然SAP/PI可以以发布WebService 的方式实现与外部系 ...
- SAP Adapter启动报错
在启动Adapter的时候,抛出GateWay Service Exception 当时用的gateway service是“sapgw00” 解决方法:这是由于当sap系统向本机注册服务的时候出错, ...
- SAP CRM和C4C数据同步的两种方式概述:SAP PI和HCI
SAP Cloud for Customer(C4C)和SAP其他传统产品进行数据同步的方式,如下图所示,可以使用SAP Netweaver Process Integration或者SAP HANA ...
- 033.SAP上查看IDOC接口,PI接口查不到的日志记录,可能在IDOC接口日志里面
01. SAP系统发料之后,数据没有传输到条码系统,同事也没有任何bc01的日志,这是就要考虑是不是在IDOC接口了,输入事务代码WE02或者WE05 02.双击查看内容 03.点开就能看到详细内容了 ...
- ABAP开发顾问必备:SAP ABAP开发技术总结
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- idoc 和 bapi 和 rfc 之间的区别
se37 写出来的叫function,其中可以远程调用的叫rfc,remote-enabled function,abap语法和输入输出参数就会有一些限制.bapi是sap做好的实现特定业务操 ...
- ABAP开发顾问必备:SAP ABAP开发技术总结[转载]
转载自SAP师太技术博客,原文链接:http://www.cnblogs.com/jiangzhengjun/p/4260224.html 在原文上增加了链接,此文及此文的链接版权都归SAP师太所有. ...
- How to : SAP PI Cache Refresh
Requirement : Identify various tools/resources available to perform SAP PI Cache refresh . Please no ...
- 开源数据同步神器——canal
前言 如今大型的IT系统中,都会使用分布式的方式,同时会有非常多的中间件,如redis.消息队列.大数据存储等,但是实际核心的数据存储依然是存储在数据库,作为使用最广泛的数据库,如何将mysql的数据 ...
随机推荐
- eclipse里maven install时,报错提示jdk为无效的目标版本:1.7
http://blog.csdn.net/wabiaozia/article/details/51733372 ************************************ 报错提示: [ ...
- xmpp4-总览
1注意点 创建的聊天室本地缓存,和服务器存储有时不同步,似乎聊过天就更稳定一点.
- phpstorm xdebug 碰到很神奇的一件事
早上配置好了,且正常运行了,然后没有退出phpstorm, 结果到了下午,配置消失了, 还好稳住了阵脚,然后配置了,就好了. 很重要一点,在调试观看源代码的时候,一定要浅薄,然后深入,不然累死,得不偿 ...
- OpenCV3编程入门笔记(5)重要章节小节及核心函数
- 【转】 探索UDP套接字编程
UDP和TCP处于同一层网络模型中,也就是运输层,基于二者之上的应用有很多,常见的基于TCP的有HTTP.Telnet等,基于UDP有DNS.NFS.SNMP等.UDP是无连接,不可靠的数据协议服务, ...
- 日期操作类--GregorianCalendar类
GregorianCalendar--API JavaTM Platform Standard Ed. 6 GregorianCalendar类 Calendar类实现了公历日历,GregorianC ...
- JavaScript window
window -- window对象是BOM中所有对象的核心 window,中文"窗口" window对象除了是BOM中所有对象的父对象外,还包含一些窗口控制函数 全局的windo ...
- iOS开发数据库SQLite的使用
iOS系统自带Core Data来进行持久化处理,而且Core Data可以使用图形化界面来创建对象,但是Core Data不是关系型数据库,对于Core Data来说比较擅长管理在设备上创建的数据持 ...
- Qt之保持GUI响应
简述 Qter们经常遇到由于耗时操作造成GUI阻塞的问题.其实,这个问题并不难克服,可以采用许多不同的方式,下面我会列举一些可选范围,根据使用情况进行处理. 简述 执行耗时操作 手动事件处理 使用一个 ...
- js中String.prototype.format類似于.net中的string.formitz效果
String.prototype.format = function(args) { if (arguments.length>0) { var result = this; if (argum ...