JCo-在Java中调用ABAP服务
2022-06-11
来源:步旅网
维普资讯 http://www.cqvip.com 视角I帮子离骂 VIEWPOINT ̄ 0一在Java中调用ABAP服务 r C 文/邹远 概述 SAP的R/3系统与Java平台一样有着许多类似的技 安装与配置 最新版本的JCo库可以在如下网址下载(请选择适 念,以及同样广泛的企业级用户,但是它们完全是两个 合你的软件和硬件平台的版本,本文的示例都基于32位 的世界。当用户面临流程或者数据整合方面的需求的时 Windows操作系统): 就迫切需要一种高效的方式,在R/3系统和Java平台 实时地交换数据。基于这样的需求,SAP提供了一套 http://service.SQP.com/connectors 你可能需要提供SAP Service MarketPlace的用户 的基于RFC的ABAP和Java进程间通讯组件:SAP 帐号。解压缩以后,将名为librfc32.dll的文件复制到目 】Connector(JCo1。 录{windows—dir}\system32下面。如果该文件已经存在, 则覆盖它。这个文件就是SAP的RFC协议实现,可以在 本文将介绍JCo组件的架构,配置,基本使用方法以 http://service.sap.com/connectors下载其最新版本。 试,同时还将讨论如何对RFC方式调用的ABAP函数 远程调试。 然后,确保CLASSPATH环境变量中包含文件sapjco. iar所在的目录。因为这个JAR包中含有在Java程序中需 要直接调用的类和接口。 JCo组件的基本架构如下图(引用自http://help.sap. I)所示: 下载的压缩包中还包含了JavaDoc,文档以及示例程 序供参考。 建立连接 在执行任何操作之前,必须先建立到SAP系统的连接。 类JCO是Jco库中最主要的一个入口,它提供了许多 静态方法。其中有一系列重载的createClient方法可以用 来创建与SAP系统的连接信息。这些信息都保存在返回的 JCo.Client类的实例中。 很多情况下,频繁创建新的连接可能导致严重的性 能问题。典型的情况就是在Web应用程序中,如果每个 session创建一个连接,那么用户数量很多的时候系对系统 来说就是一场灾难。JCo库支持以连接池的形式重用已创 建的连接。只需要调用JCo类的静态方法addClientPool 如图所示,JCo库提供了可以直接在Java程序中 即可创建一个连接池,并且可以在参数中指定连接池的名字 的API。该API通过JNI调用部署在客户端的SAP的 和允许同时激活的最大连接数。 库。该RFC库是用C语言实现的,并且与JCo库相 立发布。但是,在下载的JCo库压缩包中也会提供。 作为一种最佳实践,建议使用try—catch封装使用 JCo库进行参数设置和函数调用的代码,处理上述两种异 己口口日.口5i i1 79 维普资讯 http://www.cqvip.com 辫 I视角 >( ≤ LvIEwPoINT 常,并且在finally代码块中,释放当前所使用的连接。 更进一步,通过启动ABAP的远程调试功能,可以像 调试普通程序一样调试远程调用的ABAP函数。 远程调试 一要实现远程调试,首先需要在Java代码中,通过调用 JCO.Client类或者JC0.Pool类的sefAbapDebug方法 般的情况下,在SAP服务器上通过事务代码SE37 激活JC0的ABAP调试功能。 如果一个连接池的ABAP调试功能被激活,那么其中 可以测试ABAP函数。在保证ABAP函数的正确性之后, Java客户端只需要检查输入输出参数是否正确即可。这时 的所有连接的ABAP调试功能都会被激活。使用这样一个 可以利用JCo库为了方便调试而提供的了一个很强大的功 连接来调用ABAP函数的时候,SAP系统会自动弹出一个 能,把所有继承自JCO.Record的类的对象格式化输出到 调试器窗口(如下图所示)。当然,前提是客户端机器上已 一个指定的HTML文档中。通过这种方式,我们可以检查输 经安装了SAPGUI。 入输出参数是否正确。 从右图可以看到,这时候 调试器仅仅停留在RFC调用 的入口处,而并未进入所调用 的ABAP函数。 Function Builder:Display BAPIFLIGHTGETLIST __删ve 为了让调试器直接进入 31 c lear:msglhlp,搬sg2h - ——≥ ‘ I ABAP函数,需要在事务代码 SE37中为该函数设置一个外部 断点(External BreakPoint)。 如右图所示: 一 32 33 reZresh: return, £1ight—li毒t, 巴xt邑ns1o Lout- - j 3 35 『 * Kt2 ̄oni ty check 36 叠 3 廿 e%uthority—check。bjecc’S—FLBOOK {一 1口’’A l I… t}1e王d 一 ’U 39 E | q0 1f sy—subrc<>0- eall ̄unc ̄ion。BALW B鱼PIRE丁URN GE丁2。 蛊i q2 q3 EXP0R丁ING TYPE CI. ==‘E 。BC IBF。 qq qS q6 mllmER=・004。 IHP0R丁IN6 RETURN—RETI豫N. 80 EE: i..I嚣 NLE I EDDB.C]E 维普资讯 http://www.cqvip.com 视角 孑萼 VIEWPOINT. ̄  ̄Activate RemoteABAPDebugging 因/ Debu口口∞-ln缸/ U9Br-ID 设置好外部断点之后,还 必须通过事务代码SRDEBUG Set brB 4 -nts/ @al AIXW.Servers 肋zd l 激活远程调试功能。SRDEBUG 启动后的界面如右图所示: ofor LOGON group pUeLIC Breakpo ̄Info/ Ext ̄nal ̄eakpoinG already sat 0New breakp( ̄nts FunctionModule FuncUonMod ̄e FunctionModule Class Method Class Method Class Nleth ̄ I I I I lI l l l l l l f ll ll 如果之前没有直接在代码上设置过外部断点的话,也可 以直接在SRDEBUG中设置断点所在的Function Module。 此时,再执行Java代码,将会发现系统自动打开的 DEBUG窗口自动停留在我们所设置的外部断点的位置,而 要注意的是,在调试结束之前,不要关闭SRDEBUG的窗口, Java进程在调试结束之前将会被挂起。 否则系统将会立即关闭远程调试功能。 ■ 37 38 authori y—ch ̄ck曲]ecc‘S FLBOOK‘ id‘^CT T。 field—O3‘ 园 39 f | 0 41 if my—mubrc<)0. cal1 func ion。B^L B^PIRETURN GET2・ EXP0RTING 凹 % 圈 目 n q2 q3 HpE CL 一・E =’BC IBF。 4 ^5 肿髓ER z・004・ IⅡPoRTIt;0 豢 T 46 q1 Rlr删append return. RZTI ̄q8 perTorm nMlreturn—_mesm曲e q9 U¥IN0 ・E・ 50 5j C ̄ANGING recurn[】. reC urn_n 50 53 54 endif. 。 。 …。End of  ̄homi y check。 + …。‘ 55 56 E }… 川 aAd:i f0r Custome:s ̄ecific coei 在ABAP调试器中,可以检查通过RFC协议传过来的 最后,在调试结束的时候,还请不要忘记关闭 参数,以及ABAP程序运行的结果。通过这种方式,可以 SRDEBUG的窗口和清除外部断点。f 更清晰地跟踪整个执行过程。 pnnB.ns 毒焉篆81