对接SAP问题

场景:自动收款业务,针对现金的收款实现系统自动收,采用的是SpringMvc定时器,每5分钟执行一次,执行前4分钟的业务,因为每次收款需要把收款流水的用款记录发送给SAP,针对这一笔流水的用款明细和余额做记录;
问题:财务同事找我反映,今天同一笔业务不停在给SAP发送记录,现在收款还没有收呢(触发SAPwebService接口有两种方式,一种是自动任务触发,一种是业务员手动收款时触发的),SAP中流水的钱都变为负的了,并且还负了好几倍,然后又有人给她打电话,然后给我说,现在不止一笔是这样,好多笔都是,然后我就说,我看下,一会找到问题,给你说。
解决方案:我还是依旧先看执行的日志,发现确实是有好多笔业务在不停的执行,但是执行完之后数据库中未变化,处理尝试1:我以为是数据库表锁了,然后就百度了一下,查询了数据库表是否被锁,查了一下,果然并没有被锁的表。处理尝试2:这下如果和数据库没问题,那就是事物控制了,就看了下代码,发现没问题啊,日志中也没有错误啊,这个事物为啥没提交呢。这个时候,财务同事说,有个客户的流水已经被收款了13遍了,你这边还不行吗?我看问题有些棘手,就先和经理说了一下情况,这个无疑都是自动任务多次执行,但是并没有对数据库进行操作,并且平常1天下来才100M的服务日志,现在半天都已经300多兆了。就先把这个自动任务给停了,然后开始排查问题,这个时候还是一直以为是事物的问题,以为是事物未提交呢,想写一个提交事物的方法,后来又看了看Spring在代码中的事物管理,还是没问题啊,然后就开始找异常回滚的日志,把异常报错的日志给找出来,然后在日志中全文检索。果然查了下报了个异常,是因为有个查询本应该查出来一条的,但是同一个业务编号却查出来两条数据,查了一下数据库中,确实是两条并且数据完全一样,根据生成日期,发现就相差几秒钟,这个应该重复执行导致的了,先不管这些其他的了,我先把多出来的业务给删除了一笔,然后启动服务,等5分钟执行自动任务,再查看数据库,没问题了。
问题描述:现在出现的问题是这样的,我操作的数据是一条一条调用WebService然后发送给SAP的,但是再执行其中一条数据的时候,因为数据异常事物就不提交了,然后回滚,但是实际上这一笔业务的流失数据已经发送给SAP了,他们那边根本不知道,你这边数据有问题,回滚了。那些重复收款的数据也是这么来的,执行自动收款的操作,操作了一半数据了,然后中间有一笔业务异常了,然后回滚,但是数据也已经发送给SAP了,他们那边就操作流水的减少,然后5分钟后再执行,还是执行到这一笔业务出现异常,然后回滚,数据同样发送给SAP了,然后就这样。。。导致了重复收
实际上我们这边的操作是没问题的,因为事物就是ACID要不都成功,要不都失败,这边是异常了所以事物就显示失败,并没有提交数据。唯一有问题的就是,SAP并不知道我们这边异常,所以他们还是照常的执行。
解决方法是:可以多次使用消息传递,比如,我发送第一次数据给SAP然后SAP在请求我们一次,就是查询我们这边是否操作成功,我们接着再请求SAP一次告知结果即可。
这个是从和银行对接放款中找到的灵感,他们那边的操作是,我们这边执行放款操作,如果操作正常的话,会再请求一下银行查询交易的接口,如果银行那边返回结果较晚,可能我们这边就会报超时的异常,得再查询一下交易,从查询交易中得到的结果为最终银行返回的结果。就是,请求银行放款接口,放款成功后,会把订单状态改为放款中的状态,这个时候就需要请求查询交易结果的接口了,从查询交易结果中拿到的结果为最终的结果,如果银行那边程序异常了,那么返回给我们的结果也会是支付失败

SAP RFC 是一种与 SAP 系统进行交互的协议,它可以实现前端与 SAP 系统之间的数据交互。前端对接 SAP RFC 需要使用 SAP 提供的 SAP NW RFC SDK,该 SDK 提供了一组 C/C++ 函数库,用于实现与 SAP 系统之间的数据交互。因此,前端需要先将 SAP NW RFC SDK 集成到前端项目中,然后使用相关的函数库进行开发。 以下是一个简单的示例,说明前端如何通过 SAP NW RFC SDK 对接 SAP RFC: 1. 首先,前端需要将 SAP NW RFC SDK 集成到项目中。可以通过下载相应的 SDK 版本,并将其集成到前端项目中。 2. 通过 SAP NW RFC SDK 提供的函数库,初始化 RFC 连接。可以使用 SAP NW RFC SDK 提供的 `RfcOpenConnection` 函数初始化连接。 ```javascript const connectionParameters = { USER: 'username', PASSWD: 'password', LANG: 'EN', ASHOST: '192.168.0.1', SYSNR: '00' }; const connection = sapnwrfc.RfcOpenConnection(connectionParameters); ``` 3. 根据 RFC 接口规范,构造相应的 RFC 请求参数。可以使用 SAP NW RFC SDK 提供的 `RfcCreateFunction` 函数创建一个 RFC 函数对象,并使用 `RfcSetParameter` 函数设置相应的参数值。 ```javascript const functionModule = connection.getFunction('BAPI_MATERIAL_GET_DETAIL'); functionModule.setString('MATERIAL', 'ABC123'); ``` 4. 调用 RFC 函数。可以使用 SAP NW RFC SDK 提供的 `RfcInvoke` 函数调用 RFC 函数,并获取返回值。 ```javascript connection.invoke(functionModule) .then(() => { const materialDescription = functionModule.getString('MATL_DESC'); console.log(materialDescription); }) .catch((err) => { console.error(err); }); ``` 需要注意的是,对接 SAP RFC 需要在前端项目中集成 SAP NW RFC SDK,这需要相关的技术背景和经验。另外,由于 SAP 系统的复杂性,对接 SAP RFC 也需要遵循相应的规范和要求,否则可能会出现数据传输失败、数据解析错误等问题。因此,在对接 SAP RFC 之前,建议寻求相关的技术支持和指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值