如何使用JCO3.0同时访问多个SAP系统

SAP接口的几个注意事项 最近写sap接口,发现他真不好用,没办法,工作要求,先说基本用法: 1,设置接口信息: //SRM 生产环境 private static Properties setSRMProdProperties() { Properties connectProperties = new Properties(); connectProperties.setProperty(DestinationData... 阅读详情

遇到问题

前两天遇到一个SAP JCO 3.0 开发的问题,分享给大家解决方法。共享系统连接两个(多个)SAP代理商系统,其中SAP所在服务器、函数、字段全部不一样,这是两个完全不一样的SAP系统。最终出现,最多只能连接成功其中任意一个SAP系统。

知识前提

为了完成这个事情的探索,还需要一些基本的应用积累。

接口文件

  1. 在Windows环境下将dll文件放到windows的system32文件中;
  2. 在Linux环境下将so文件放入指定的路径里,并指定启动参数中包含这个路径。
  3. 将jar文件放到java程序中使用。

这里写图片描述

连接方式

目前市面上常见两种方式。

简单连接

对象初始化时,装载properties以及自定义destnationName,然后将properties保存到java web跟目录。因为SAP在这种情况下,是默认读取java web根目录的配置文件,然后进行连接的。

public class JcoTest {
    static String DESTINATIONNAME = "ABAP_AS_WITHOUT_POOL";
    static String DESTINATION_NAME2 = "ABAP_AS_WITH_POOL";

    // 配置连接
    static {
        Properties connectProperties = new Properties();
        connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "192.168.6.66");// IP
        connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "00");// 系统编号
        connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "100");// 客户端编号
        connectProperties.setProperty(DestinationDataProvider.JCO_USER, "sscrfc");// 用户名
        connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "abc123");// 密码
        connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "zh");// 语言
        connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "30");// 最大空闲连接数
        connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, "150");// 最大活动连接数
        createDestinationDataFile(DESTINATION_NAME1, connectProperties);
    }

    /**
     * 
     * 保存配置文件  <br>
     *
     * @param destinationName
     * @param connectProperties  void
     */
    static void createDestinationDataFile(String destinationName, 
        Properties connectProperties) {
        File destCfg = new File(destinationName + ".jcoDestination");
        try {
            FileOutputStream fos = new FileOutputStream(destCfg, false);
            connectProperties.store(fos, "For tests only !");
            fos.close();
        } catch (Exception e) {
            throw new RuntimeException("Unable to create the destination files", e);
        }
    }

    /**
     * 
     * 测试连接  <br>
     *
     * @return
     * @throws JCoException  JCoDestination
     */
    public static JCoDestination getSAPDestination() 
        throws JCoException {
        JCoDestination destination = JCoDestinationManager.getDestination(DESTINATIONNAME);
        destination.ping();
        return destination;
    }
}
使用DestinationDataProvider连接
public class JcoProviderImpl implements DestinationDataProvider {

    private Map<String, Properties> proMap = new HashMap<String, Properties>();

    @Override
    public Properties getDestinationProperties(String destName) {
        return proMap.get(destName);
    }

    @Override
    public void setDestinationDataEventListener(DestinationDataEventListener arg0) {

    }

    @Override
    public boolean supportsEvents() {
        return false;
    }

    /**
     * 
     * 填充连接参数 <br>
     *
     * @param destName
     * @param p
     *            void
     */
    public void addProperty(String destName, Properties p) {
        proMap.put(destName, p);
    }
}

上面是注册provider,接下来是使用它进行连接,定义一个管理类。

public class RfcManage {

    private JcoProviderImpl provider;

    public RfcManage(JcoProviderImpl provider) {
        this.provider = provider;
    }

    /**
     * 
     * 注册Provider <br>
     * void
     */
    public void registProvider() {
        try {
            Environment.registerDestinationDataProvider(provider);
        } catch (Exception e) {
            throw new InfomationException("注册Provider异常", e);
        }
    }

    /**
     * 
     * 取消注册 <br>
     * void
     */
    public void unRegistProvider() {
        try {
            Environment.unregisterDestinationDataProvider(provider);
        } catch (Exception e) {
            throw new InfomationException("取消注册Provider异常", e);
        }
    }

    /**
     * 
     * 获取连接实例 <br>
     *
     * @param destinationName
     * @return JCoDestination
     */
    public JCoDestination creataDestination(String destinationName) {
        try {
            JCoDestination destination = JCoDestinationManager.getDestination(destinationName);
            destination.ping();
            return destination;
        } catch (Exception e) {
            unRegistProvider();
            throw new ExtRuntimeException("获取JCoDestination异常", e);
        }
    }
}

接下来是测试类。

JcoProviderImpl provider = new JcoProviderImpl();
provider.addProperty(DESTINATION_NAME1, getP());
RfcManage manage = new RfcManage(provider);
// 注册连接
manage.registProvider();
// 获取连接
JCoDestination dest = manage.creataDestination(DESTINATION_NAME1);
// 调用函数
JCoFunction function = dest.getRepository().getFunction("ZSSC_MD_VENDOR");
System.out.println(function);

核心思想是,在调用sap接口前需要重写DestinationDataProvider 中的 getDestinationProperties方法,将我们自定义的连接名称和连接配置设置上去。然后使用Environment.registerDestinationDataProvider(provider);进行注册。最后就可以获取Destination对象,进行调用函数的使用了。

解决问题

现在回到问题。共享中心连接两个(多个)完全不同SAP代理商,根据jco3.0中官方说明。Environment.registerDestinationDataProvider 只能在注册一次。

SAP官方解释如下:

Only one implementation of DestinationDataProvider can be registered. For registering another implementation the infrastructure has first to unregister the implementation that is currently registered. It is not recommended to permanently exchange DestinationDataProvider registrations. The one registered instance should globally manage all destination configurations for the whole infrastructure environment.

译文:

只有一个DestinationDataProvider实现可以被注册。 为了注册另一个实现,基础架构首先注销当前注册的实现。 不建议永久交换DestinationDataProvider注册。 一个注册实例应全局管理整个基础架构环境的所有目标配置。

最终方式

查阅了很多资料,试过了很多方法,直到看到上面这个解释的时候,才明白问题的根本。根据官方的解释,那么我们之前在代码定义的unregisterDestinationDataProvider终于有了用武之地。所以最终的方法是:

JcoProviderImpl provider = new JcoProviderImpl();
provider.addProperty(DESTINATION_NAME1, getP());
RfcManage manage = new RfcManage(provider);
manage.registProvider();
JCoDestination dest = manage.creataDestination(DESTINATION_NAME1);
JCoFunction function = dest.getRepository().getFunction("ZSSC_MD_VENDOR");
System.out.println(function);
manage.unRegistProvider();

总结

调用unregisterDestinationDataProvider方法。举个例子,连接SAP-1后,如果想再连接SAP-2那么必须先取消provider的注册。从官方说明上来看,其实是不建议这样做的,但目前没有找到更好的解决办法。因为每次注册都会消耗一定的资源,如果只有一个SAP系统,只需要第一次使用时注册,后续调用函数时无需也无法再此注册。

JAVA使用JCo连接SAP 1. SAP Java Connector (SAP JCo) 是JAVA与SAP相互通信的中间件组建,该组建支持双向通讯模式(inbound calls 和 outbound calls )。JCo支持Connection Pools和Direct两种方式的连接。直接连接需要开发者来控制连接的创建和释放,使用连接池方式可以让池来管理连接的分配、管理和释放,可以最大限度的节省系统开... 阅读详情

相关推荐

SAP接口编程 之 JCo3.0系列:JCoDestination

JCo3.0是Java语言与ABAP语言双向通讯的中间件。与之前1.0/2.0相比,是重新设计的产品。API和架构设计与NCo3.0比较类似,前面也说过,NCo3.0的设计参考了JCo3.0。从本篇开始,系统介绍JCo3.0编程的技术要点。 JCo3.0安装 从https://service.sap.com/connectors可以下载JCo3.0,注意下载的时候根据操作系统和JVM版本(32位还是64)选择不同的版本。安装就是解压,将文件解压到目标文件夹。以Windows系统为例,主要的文件包括: .

matinal 當冬夜漸暖 。公众号:matinal 941

JCO 自定义DestinationDataProvider

要让JAVA程序能访问SAP系统,一般通过SAP JCO接口进行通讯,在获取到SAP的连接时需求提供一些连接参数,这些参数在最新的JCO 3.0中需要被保存到一个带有扩展名.jcoDestination的文件中,这个文...

cl3038556的博客 879

掌握SAP JCO 3.0.17:Java与SAP系统集成的桥梁

SAP JCO(Java Connector)是SAP提供的一款强大的Java库,它主要用于简化Java应用程序与SAP系统的通信。作为企业信息系统集成的关键技术之一,SAP JCO使得Java开发者能够以标准的方式与SAP系统的各种服务进行交互。

weixin_28746457的博客 943

Java使用Jco连接SAP操作详解

最近加入的新项目需要和SAP进行接口对接,想尝试将项目代码中关于SAP连接部分剥离出来,可能存在些错误,欢迎大家指正!!!

weixin_44894196的博客 5265

SAP JCo 3.0.11 全平台Java连接器安装包

SAP Java Connector (JCo) 是一个用于Java应用程序与SAP系统之间进行集成的中间件库。自2000年以来,JCo已经成为开发者访问SAP系统的首选工具,特别是在B2B集成和内部应用程序中。它提供了一种标准方式,可以与SAP NetWeaver应用服务器中的RFC (Remote Function Call) 接口进行通信。JCo不仅支持与传统SAP R/3系统的通信,还与新的SAP NetWeaver系统和S/4HANA系统保持兼容。

weixin_33759613的博客 796

SAP JCo 3.0.9 Windows 32位完整开发包

SAP Java Connector(JCo)是SAP官方提供的高性能中间件库,专用于实现Java应用与SAP ABAP系统之间的双向通信。其核心功能基于RFC协议,支持远程调用BAPI、自定义函数模块及数据表查询,广泛应用于ERP集成、主数据同步和业务流程自动化场景。JCo采用JNI技术桥接Java与SAP内核,其中提供Java API层,而(Windows平台)作为原生动态链接库负责底层通信。

weixin_42596011的博客 885

SAP接口编程 之 JCo3.0系列(01):JCoDestination

SAP接口编程 之 JCo3.0系列(01):JCoDestination 字数2101阅读103评论0喜欢0 JCo3.0是Java语言与ABAP语言双向通讯的中间件。与之前1.0/2.0相比,是重新设计的产品。API和架构设计与NCo3.0比较类似,前面也说过,NCo3.0的设计参考了JCo3.0。从本篇开始,系统介绍JCo3.0编程的技术要点。 JCo3.0安装 从http...

weixin_30649859的博客 509

JCO 3.0:Java与SAP系统集成的桥梁

Java Connector Architecture (JCA) 3.0 引领了企业级连接技术的新纪元,为开发者提供了更加强大、高效和灵活的方式来处理不同系统之间的集成问题。JCO 3.0带来了显著的性能提升、更精简的资源占用,以及对新兴技术的支持。

weixin_29215509的博客 1184

Java连接SAP ————JCO 3.0技术详解

SAP的ERP平台很强大,这是毋庸置疑的,它被运用于个个行业领域,也正因如此,所以公司上线SAP后,总需要花费很多时间去培养用户,有时候,在SAP上,用户的操作需求很简单,但在SAP平台上,却不得不进行许多复杂的操作。 ======================================================================================= ...

少年休闲海 9053

SAP JCo 3.0.12_32Bit:Java与SAP系统的集成工具

本文还有配套的精品资源,点击获取 简介:SAP JCo是SAP公司推出的Java组件,用于在Java应用和SAP系统之间建立连接和数据交换。"SAP JCo 3.0.12_32Bit"是专为32位操作系统设计的版本,支持Java SE和JEE环境,并提供了与SAP R/3系统集成的关键特性。开发者可以利用这一工具,实现高效、多线程的SAP功能模块调用,并进行错误处理和动态元...

weixin_29041443的博客 1497

EEVDF调度算法核心实现解析(一)

本文深入解析Linux kernel 6.6引入的EEVDF调度算法核心实现,详细讲解其基于虚拟截止时间(virtual deadline)的进程挑选机制和红黑树优化设计。通过代码实例展示算法如何平衡系统响应速度与公平性,特别适合需要优化Linux系统性能的开发者参考。

weixin_42522953的博客 478

JAVA对接SAP接口使用sapjco3的见解

参考了作者zfswff的资料 SAP JCo3.0是Java语言与ABAP语言双向通讯的中间件。与之前1.0/2.0相比,是重新设计的产品。API和架构设计与NCo3.0比较类似,前面也说过,NCo3.0的设计参考了JCo3.0。从本篇开始,系统介绍JCo3.0编程的技术要点。 JCo3.0 安装 下载JCo3.0,注意下载的时候根据操作系统和JVM版本(32位还是64)选择不同的版本。安装就...

qq_38284858的博客 1万+

京东技术产品经理面试全记录:从简历投递到一面45分钟实战复盘

本文深度复盘京东技术产品经理面试全流程,从策略准备、思维题拆解、项目阐述到反问谈判,提供了一套可演练的求职策略体系。文章强调该岗位需具备横跨技术与商业的枢纽能力,并通过“QQ分组vs微信标签”等案例,剖析了产品思维与结构化表达在面试中的关键作用,助力候选人将紧张转化为掌控感。

weixin_29275257的博客 630

Java 代码使用 JCo3 对接 SAP RFC 函数

Java 代码使用 JCo3 对接 SAP RFC 函数

Calvin Chan的博客 1333

〔重庆理工大学〕计算机组成原理课设报告--16位单周期CPU设计

本课程设计的实验平台为Altera Quartus II 软件和Altera Cyclone V Starter 工具箱。(1)Cyclone V是Altera FPGAs家族的一类,它面向低功耗应用。Cyclone V GX 5CGXFC5C6F27C7N 芯片有不同的转换器,按钮,LED灯,七段显示器,HDMI接口,SD卡读卡器以及其他链接等。Cyclone V GX 5CGXFC5C6F27C7N是Starter工具箱的重要组件。(2)测试台包含在测设备(DUT)和用于仿真的模拟输入。

Pretty Boy Fox的博客 1066

华为OD机试 - 猴子吃桃 - 二分查找(Java 新系统 100分)

每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 3850

SpringBoot项目使用JCO实现调用SAP接口实例

一、JCO接口介绍 JCO采用的是中间式接口,即外部系统将SAP系统所需的信息生成中间数据表,SAP系统直接读取中间文件或将中间表中的信息写入数据库中,中间式接口是比较常用的一种方式,这种方式外部系统和SAP系统相对独立,接口不涉及双方内部的结构,而且接口的责任也很明确,数据的安全性也得到了保证。但这种方式存在的问题就是两个系统的数据同步性稍差一些,但只要合理地规定读写中间文件或数...

qq_41046474的博客 8759

CDD数据库文件制作(三)——服务配置(0x10)

根据诊断调查表进行每一步配置的详细操作,与背后逻辑解释 1.会话切换配置 1.1.根据诊断调查表进行信息提取(0x1001) 1.2.会话转换配置(0x1001) 1.3.根据诊断调查表进行信息提取(0x1002) 1.4.会话转换配置(0x1002) 1.5.根据诊断调查表进行信息提取(0x1003) 1.6.会话转换配置(0x1003) 1.7.会话切换配置完成后效果图 2.安全等级配置信息提取 2.1.安全访问配置(0x1001) 2.2.安全访问配置(0x1002) 2.3.安全访问配置(0x100

LOVE135149的博客 5840

JAVA使用JCo连接SAP介绍-1

  SAP Java Connector (SAP JCo) 是JAVA与SAP相互通信的中间件组建。该组建支持双向通讯模式(inbound calls 和 outbound calls )。 JCo支持Connection Pools和Direct两种方式的连接。直接连接需要开发者来控制连接的创建和释放,使用连接池方式可以让池来管理连接的分配、管理和释放,可以最大限度的节省系统开销,相比...

qq_36026747的博客 1万+

【软件系统架构】系列六:系统工程

系统工程是一种跨学科方法论,用于分析、设计、集成和管理复杂系统的全生命周期。其核心特点包括系统性思维、全周期管理、跨学科协作和需求导向。主流采用V模型生命周期,涵盖需求分析、系统设计、实现、测试验证及运维退役等阶段。核心工作方法包括需求工程、系统建模、接口设计、风险管理等。系统工程与项目管理协同,分别侧重技术实现和进度资源管理。应用领域覆盖航天军工、智能制造、智慧城市等。未来将向AI融合、数字孪生、模型驱动工程等方向发展,为复杂系统开发提供系统化协作范式。

moton2017的博客 2257

Objective-C实现人工势场法(附完整源码)

Objective-C实现人工势场法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 426

SAP接口编程 之 JCo3.0系列:JCo Client Programming

JCo3.0调用SAP函数的过程 大致可以总结为以下步骤: 连接至SAP系统 创建JcoFunction接口的实例(这个实例代表SAP系统中相关函数) 设置importing参数 调用函数 从exporting参数或者table参数获取数据 代码: package jco3.demo4; import org.junit.Test; import com.sap.conn.jco.JCoDestination; import com.sap.conn.jco.JCoDestinati

matinal 當冬夜漸暖 。公众号:matinal 718

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

因SAP升级引起SAP通过jco访问java服务端问题

因SAP升级,而影响SAP访问java端的JCoServer,这这两周都在搞这些了。走了不少弯路,也收获很多,希望给有类似需求的朋友有所帮助。 Sap系统: 用SM59调整TCP/IP 下的SAP 到MBS的链接,SAP的编码由NON-UNICODE改成UNICODE后,SAP主动访问java访问有问题,连接不通。 java系统jco server端之前用的jco2.15,结果连接有问题。

nestashen的专栏 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java(JCo3)调用sap接口

安装JCo3 windows安装 将sapjco3.dll拷贝到c:/windows/system32与C:\Program Files (x86)\Java\jdk1.7.0_51\bin下,将sapjco3.jar加入项目的classpath中 linux安装 sapjco3.jar放入Java的lib目录下,将libsapjco3.so放入Java/jre/lib/amd64/ser...

qq_32253371的博客 3351

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: 使用Axis2解析wsdl生成Webservice客户端Java代码
cqlancer
博客等级 码龄16年 1粉丝 2原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值