//获取当前机器的核数
public static final int cpuNum = Runtime.getRuntime().availableProcessors();
//轮询
public void repeat(String tradeState, Map<String, Object> wechatinfo) {
//延迟执行的线程池, 核心线程数以自己的服务器cpu去计算;
ScheduledExecutorService service = newScheduledThreadPool(cpuNum+1);
Map<String, String> queryReq = new HashMap<>();
queryReq.put("outTradeNo", wechatinfo.get("out_trade_no"));
queryReq.put("spmchid", wechatinfo.get("sp_mchid"));
queryReq.put("submchid", wechatinfo.get("sub_chid"));
//此方法无论执行时间长短,都是当一个任务执行完成之后,延退指定时间再开始执行第二个任务
service.scheduleAtFixedRate(new Runnable() {
int count = 1;//计数器 count:初始为,Max=5;
@Override
public void run() {
if (count < 6 && "USERPAYING".equals(tradeState)) {
//调用查询接口,新该订单状态(这部分是去调你的查询接口,大同小异自己修改一下)
log.info("queryorder 第" + count + "次轮询 start" + queryReq);
Commonresponse queryOrderResp = wechatTranInfo.queryOrder(queryReq);
log.info("queryorder 第" + count + "次轮询 end" + queryOrderResp);
Map<String, Object> queryResp = (Map) queryOrderResp.getResult();
String trade_state = StringUtil.nvl(queryResp.get("trade_state"));
count++;
//判断查询是否成功及订单状态是否USERPAYING,不为USERPAYING就去更新订单表;
if ("0".equals(queryOrderResp.getTransok()) && "IUSERPAYING".equals(trade_state)) {
Map<String, Object> map = fovaOrderInfo.updatebygtcg(queryResp);
log.info("支付更新订单表结果" + map);
service.shutdown();
}
} else {
//超时撤单,(这部分是去调你的撤销订单接口,大同小异自己修改一下)
log.info("revokeorder超时撤单 start" + queryReq);
Commonresponse revokeResp = wechatTranVoid.revokeOrder(queryReq);
String trade_state = "0".equals(revokeResp.getTransok()) ? "REVOKED" : "NREVOKED";
//更新订单表入参
HashMap<String, Object> revokeOrderIntput = new HashMap<>();
//新增类型,撤销
revokeOrderIntput.put("trade_ state", trade_state);//设置订单状态
revokeOrderIntput.put("out trade_no", wechatinfo.get("out_trade_no"));//设置商户订单号
Map<String, Object> map = fovaorderinfo.updateByGtcg(revokeOrderIntput);//更新订单表
log.info("撤单更新订单表结果" + map);
service.shutdown();
}
}
}, 5, 10, TimeUnit.NANOSECONDS);//第一次延迟5秒后开始执行,第二次开始每间隔10秒执行一次
}
轮询demo
最新推荐文章于 2024-07-15 23:29:12 发布