一. 下面的是后台记录的日志:
[0602 20:30:01 237 INFO ] [queueContainer-3] commons.component.ActiveMQComponent - MQ receive Message: key=BD,value="thirdBD:{\"accountId\":\"001101632119535\",\"amount\":270.00,\"businessOrderId\":\"150602201831701656\",\"cardNo\":\"6222021507001069767\",\"externalCode\":\"1001\",\"externalMemo\":\"交易成功\",\"id\":\"20150602201831722169\",\"status\":1}"
[0602 20:30:01 238 INFO ] [queueContainer-3] common.mq.LostOrderQueueMessage - 自动补单MQ接收的内容[thirdBD:{"accountId":"001101632119535","amount":270.00,"businessOrderId":"150602201831701656","cardNo":"6222021507001069767","externalCode":"1001","externalMemo":"交易成功","id":"20150602201831722169","status":1}]
[0602 20:37:44 033 INFO ] [queueContainer-7] commons.component.ActiveMQComponent - MQ receive Message: key=BD,value="thirdBD:{\"accountId\":\"001101632119535\",\"amount\":270.00,\"businessOrderId\":\"150602201831701656\",\"cardNo\":\"6222021507001069767\",\"externalCode\":\"1001\",\"externalMemo\":\"交易成功\",\"id\":\"20150602201831722169\",\"status\":1}"
[0602 20:37:44 033 INFO ] [queueContainer-7] common.mq.LostOrderQueueMessage - 自动补单MQ接收的内容[thirdBD:{"accountId":"001101632119535","amount":270.00,"businessOrderId":"150602201831701656","cardNo":"6222021507001069767","externalCode":"1001","externalMemo":"交易成功","id":"20150602201831722169","status":1}]
[0602 20:37:44 046 INFO ] [queueContainer-7] common.mq.LostOrderQueueMessage - 自动补单结果[第三方](订单号:150602201831701656 | [补单失败]订单号:150602201831701656对应的支付流水不是处理中状态!)
[0602 20:40:20 647 INFO ] [queueContainer-3] common.mq.LostOrderQueueMessage - 自动补单结果[第三方](订单号:150602201831701656 | 目前补单只限定于P2P、EXP、FACTORING、TB及未交易成功的新手标产品)
二. 多加资产问题出现过程,一步步还原现场
1、20:18创建的订单
2、去支付,发现支付处理中
3、充值处理处理中。落在超时支付表中
4、20:30轮训出结果,发送mq给汇金进行补单
第一次补单失败:
休息5分钟:
20:35开始第二次补单,补单成功,,,,发邮件异常,,,,,40分钟继续处理。。。。
5、20:37突然来了一个消息,
根据支付流水发现是成功的,直接返回
6、20:40补单,订单状态已经改成成功了,所以match不到,改订单为失败
7、下面看8:37分钟的消息怎么发生的
先去。9拉取info日志,发现只在8:30发过消息
说明不是pay,发重复消息
那么估计就是mq重发消息了,
去看下线上配置mq,发现没有配置超时时间,那么就是默认的1s
但是实际上是7秒,有问题
继续看日志,发现在8:30分 huijin失去jms连接
在8:37分钟重新连接上,所以之前的连接mq不知道是否成功,所以重发了
三. 总结
通过这个案例, 任何中间件和程序都是有可能出现不可预测的问题, 主要在程序设计过程中要注意几个点:
1. 方法一定要支持幂等性支持, 防止重复调用
2. 提交方法要预申请token, 防止多次提交
3. 网络连接的操作要有超时时间, 超过超时时间, 一定要断开