遇到问题:
最近做微信支付,项目上线一阵,发现一个问题。有一条订单流水居然在数据库的出现两次。这个问题非常严重。
查看微信回调系统的接口代码发现代码是没错的(正常情况下),而这次遇到非正常情况了
原因:微信支付成功后回调我们系统接口在极短时间回调了2次,微信官方文档说明了,是最短15s回调一次。
前几天微信支付抽风了,可能业务出现了波动。
简单来说就是在并发情况下没有做数据唯一性处理,不管怎么样这类并发情况都是有必要的处理。
解决方式:使用线程池+队列
项目基于Spring,如果不用spring需要自己把
ThreadPoolManager.java
改成单例模式
1.写一个Controller(Spring mvc)
/**
* @author HeyS1
* @date 2016/12/1
* @description
*/
@Controller
public class ThreadPoolController {
@Autowired
ThreadPoolManager tpm;
@RequestMapping("/pool")
public
@ResponseBody
Object test() {
for (int i = 0; i < 500; i++) {
//模拟并发500条记录
tpm.processOrders(Integer.toString(i));
}
return "ok";
}
}
2.线程池管理
/**
* @author HeyS1
* @date 2016/12/1
* @description threadPool订单线程池, 处理订单
* scheduler 调度线程池 用于处理订单线程池由于超出线程范围和队列容量而不能处理的订单
*/
@Component
public class ThreadPoolManager implements BeanFactoryAware {
private static Logger log = LoggerFactory.getLogger(ThreadPoolManager.class);
private BeanFact