论坛首页 综合技术论坛

Quartz定时使用JCo同步SAP系统数据

浏览 2476 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2009-08-25   最后修改:2010-03-18

 

使用 JCo 同步 SAP 系统数据

一、   项目需求

业务系统需要调用 SAP 系统的财务相关功能,调用时需要提供其所需的专有参数,如公司、科目,而这些参数都将作为可选项存在,有的可能存在上千项,如某公司下有上千个费用科目,如果每次调用时都实时链接 SAP 获取这些可选项数据,将给业务系统的性能造成影响,因此需要在业务系统上保存这些数据。

二、    项目分析

提供 SAP 系统财务相关功能所需的参数多为短时间内变化量不大的数据,如:公司、科目,在时效性上没有要求,新添加了一个科目,第二天在业务系统上才有更新可以被用户接受,因此,可以先将所需数据一次性全部保存到业务系统,然后定时同步有变化的数据。而业务系统读取这些数据时,只需要再编写 js 脚本对外提供以指定格式显示的函数即可。

三、   系统设计

数据由 SAP 系统所有,因此应该由 SAP 提供函数,定时执行,提供有变化的数据,提交到业务系统,业务系统根据 SAP 提供的数据,更新自己已经保存的数据。因此首先想到使用 WebService 方式,由业务系统提供服务,接受 XML 格式的数据,更新自己的数据。但是经测试, SAP 系统支持的 WSDL 文件规范比较低,在 SAP 系统中添加 WebService 时,业务系统提供的 WSDL 文件并不能为 SAP 系统所识别。所以,采用业务系统定时使用 Jco 链接 SAP ,执行 RFC 函数,获得有变化的数据( RFC 函数获取有变化的数据,拼成可保存为 XML 文件的字符串),更新自己的数据的方式。这里使用 Spring Quartz 来作为任务调度器,定义同步数据为一个 Job ,定义每隔一定时间为一个 Trigger (定时触发)。

四、   程序编写

1.     启动程序

com/sap/jco/SpringSchedule.java

在此文件中加载 Spring 配置文件,启动应用

2.     bean.xml

定义了 Quartz 任务调度器的实现类 schedule ,定义此调度器的触发器为 simpleTrigger ,在此 bean 中设置了触发器的启动时间和执行间隔,当然,也可以使用 org.springframework.scheduling.quartz.CronTriggerBean ,其可以设置具体在什么时间执行(视项目情况选取合适的 Trigger ),定义此调度器的 Job methodInvokingJobDetail ,在这个 Job 中使用继承了 TimerTask syncTask 中的 start 方法。

3.     真正的 Job

com/sap/jco/SyncTask.java

start() 中执行 writeService.write(readService.read());

4.     链接 SAP

com/sap/jco/util/JCOUtils.java

根据 sapBean 中配置的参数执行链接,并提供创建指定名称函数、执行指定函数对象的方法

注意:将库文件 libsapjco3.so 放在 $JAVA_HOME/jre/lib/i386 目录下

5.     获取数据

com/sap/jco/dao/impl/ReadManagerImpl.java

根据 sapbean.xml 中装配的 sapBean 链接 SAP 系统,创建函数,执行,从返回结果中获取指定名称的信息,并以名称值为 key 存储到 HashMap

6.     更新数据

com/sap/jco/dao/impl/WriteManagerImpl.java

HashMap 中根据 key 得到对应的信息,将此信息保存为 XML 文件,分别从保存原有信息和新信息的 XML 文件中得到 beanList ,然后与原有的数据做对比,如果新信息操作标示为“ D ”,则在原有信息中按照主键查找,如果存在,从原有数据中删除;如果新信息操作标示为“ U ”,则在原有信息中按照主键查找,如果存在,从原有数据中先删除记录,再添加新纪录;如果信息操作标示为“ I ”,则直接插入。操作完成后将已经有变化的信息重新写入文件。

7.      js 脚本获取数据

参见 js/funcForSAPData.js

五、   系统测试

经测试,可以达到预期效果。

六、   优缺点分析

优点:

同步数据

采用与业务系统松耦合的设计,独立于业务系统运行。

显示数据

使用 js 脚本从 xml 文件中获取数据格式化显示,在业务系统需要调用数据的位置添加 js 函数即可。

缺点:

同步数据

获取到更新的数据进行同步时,在原有数据中按照主键查找时如果不做优化,当数据量比较大时可能会影响性能。

显示数据

如果业务系统中调用数据的逻辑比较复杂,可能会导致 js 脚本量大量增加,为可读性和可维护性带来困难。

论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics