以E代驾示例的积分兑换流程
2018-04-24 11:48:50 4 举报
scheduledThreadPool = Executors.newScheduledThreadPool(52); 线程池中开启了52个线程,一个线程用来获取积分兑换任务fetchNormalPointsExchange();,一个线程用来handleAbnormalPointsExchange();处理异常处理状态的积分兑换数据 50个线程用来处理积分兑换任务 for(int i = 0;i < 50;i++) 获取到任务放入在queuePointsExchange = new ConcurrentLinkedQueue<CrmPointsExchange>(); 积分兑换队列中。 PointsEdrivingHandler来获取到订单存入大数据库中,fetchNormalPointsExchange来从数据库中取出符合条件的订单,放入队列中,50个线程强到任务,对订单Handleon加锁. 为什么要放入到ConcurrentLinkedQueue队列中,concurrentlinkedqueue线程安全,加锁和对列结合,让同一时间只有一个处理线程对订单进行操作
作者其他创作
大纲/内容
crmPointsExchange.getRequestSource()把积分兑换/回滚响应消息推送至对应的响应队列(响应给用户)
解除订单控制权
where (STATUS = 1 OR STATUS = 2 OR STATUS = 4 OR STATUS = 10 OR STATUS = 11) AND HANDLE_FLAG = 0查找出状态不是失败和完成的订单,且订单并没有被其他的线程获取到控制权
handlePointsExchangeCommit(pointsExchange);处理积分兑换消费提交
true超过单用户的流量限制
Y 已发起过兑换提交
pointsExchange.getStatus() == 10积分回滚中
更新数据库订单状态为12
ConcurrentLinkedQueue queuePointsExchange积分兑换队列
响应回退成功
handleNormalPointsExchange()处理正常处理状态的积分兑换数据
fetchNormalPointsExchange()获取正常的积分兑换数据放进待处理队列
。。。。。。。。后面的步骤和积分兑换类似
handlePointsExchangeCmNotify(pointsExchange);处理积分兑换结果通知
doPointsExchangeRollback(crmPointsExchange)进行积分兑换消费回滚
crmPointsExchange.getTryCount() 0
checkSingleUserOverflow(pointsExchange)验证单用户积分兑换/回滚请求是否超过流量限制通过redis来判断
doPointsExchangeCommit(crmPointsExchange)进行积分兑换消费提交
crmPointsExchange.getStatus() == 44-积分兑换失败未通知
pointsExchange.getStatus() == 1积分兑换中
false未超过单用户的流量限制
如果无法成功受理请求,则立即通过响应MQ通道返回错误响应消息
PointsEdrivingHandler 从请求消息队列中获取
needExchangeCommit
N从未发起过兑换提交
needExchangeRollback
CRM响应成功
pointsExchange.getStatus() == 2 || pointsExchange.getStatus() == 42-积分兑换成功未通知,4-积分兑换失败未通知
PointsExchangeMqHandler
Exception
pointsExchange.getResult() != 0判断是否成功受理请求,是否将订单信息更新到esb_crm_points_exchange表中
查找出
更新数据库订单状态为5(积分兑换失败已通知)
更新数据库订单状态为12-积分回滚成功已通知
未兑换过积分,不向crm发送积分兑换请求,直接通知响应成功
\"0\".equalsIgnoreCase(response.getErrorSpcCode())
\t\t\t\t\thandlePointsExchangeRbNotify(pointsExchange);11-积分回滚成功未通知,处理积分回滚结果通知
CRM响应失败
释放控制权
通知E代驾异常
handlePointsExchange()受理积分兑换请求
PointsEdrivingHandler
N
积分兑换失败未通知状态更新
继承
CrmPointsExchangeDAO()将受理的订单的信息存入到esb_crm_points_exchange表中,并在这张表中更新订单的处理状态(这里面包括两类业务订单,积分兑换和积分回退)
从esb_crm_points_exchange表获取出需要被处理的订单
数据库
esb_crm_points_exchange
crmPointsExchange.getStatus() == 22-积分兑换成功未通知
获取控制权
更新数据库订单状态为3(积分兑换成功已通知)
从积分兑换订单队列中取出一条积分兑换订单pointsExchange
根据请求响应回复更新数据库订单状态信息
rltPointsExchange.setStatus(5);//5-积分兑换失败已通知
引用
handlePointsExchangeRollback(pointsExchange);处理积分兑换回滚
判断需要积分兑换提交还是回滚
Y
pointsExchange.getStatus() == 11积分回滚成功未通知
更新数据库订单状态为11积分回滚成功未通知
pointsExchange.getStatus()对订单状态进行判断
受理订单失败
queuePointsExchange.add(pointsExchange)将订单加入大积分兑换队列
收藏
收藏
0 条评论
下一页