一、
项目需求
业务系统需要调用 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脚本量大量增加,为可读性和可维护性带来困难。
项目需求
业务系统需要调用 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脚本量大量增加,为可读性和可维护性带来困难。