2、库存处事在监听到动静行列OrderCreated中的动静,将库存表中商品的库存减去下单数目,然后再发送一个Stock Locked变乱给动静行列。
代码:
- /**
- * 吸取下单动静
- * @param message 吸取到的动静
- * @param session 上下文
- */
- @JmsListener(destination = ORDER_CREATE,containerFactory = "myListenerContainerFactory")
- @Transactional(rollbackFor = Exception.class)
- public void receiveOrderCreatedMsg(Message message, Session session){
- try {
- if (message instanceof ActiveMQObjectMessage){
- MqStockMsg result = new MqStockMsg();
- ActiveMQObjectMessage objectMessage=(ActiveMQObjectMessage)message;
- MqOrderMsg msg = (MqOrderMsg)objectMessage.getObject();
- Integer updateCount = stockMapper.updateNumByStockId(msg.getStockId(),msg.getGoodCount());
- if (updateCount >= 1){
- result.setSuccess(true);
- result.setOrderId(msg.getId());
- }else {
- result.setSuccess(false);
- }
- // 手动ack,使动静出行列,否则会不绝斲丧
- message.acknowledge();
- // 发送库存锁定动静到MQ
- jmsProducer.sendStockLockedMsg(result);
- }
- } catch (JMSException e) {
- log.error("吸取订单建设动静报错:"+e.getMessage());
- }
- }
细心的伴侣也许会看到:message.acknowledge(),即手动确认动静。由于在担保库存处事的逻辑能正常执行后再确认动静已斲丧,可以担保动静的投递靠得住性,万一在库存处事执行时报出非常,我们可以做到从头斲丧该下单动静。
3、订单处事吸取到Stock Locked变乱,将订单的状态改为“已确认”
代码:
- /**
- * 判定是否尚有库存,有库存更新订单状态为1,无库存更新订单状态为2,而且关照用户(WebSocket)
- * @param message
- */
- @JmsListener(destination = STOCK_LOCKED,containerFactory = "myListenerContainerFactory")
- @Transactional(rollbackFor = Exception.class)
- public void receiveStockLockedMsg(Message message, Session session){
- try {
- if (message instanceof ActiveMQObjectMessage){
- ActiveMQObjectMessage objectMessage=(ActiveMQObjectMessage)message;
- MqStockMsg msg = (MqStockMsg)objectMessage.getObject();
- if (msg.isSuccess()){
- Order updateOrder = new Order();
- updateOrder.setId(msg.getOrderId());
- updateOrder.setOrderStatus(1);
- orderMapper.updateByPrimaryKeySelective(updateOrder);
- log.info("订单【"+msg.getOrderId()+"】下单乐成");
- }else {
- Order updateOrder = new Order();
- updateOrder.setId(msg.getOrderId());
- updateOrder.setOrderStatus(2);
- orderMapper.updateByPrimaryKeySelective(updateOrder);
- // 关照用户库存不敷,订单被打消
- log.error("订单【"+msg.getOrderId()+"】因库存不敷被打消");
- }
- // 手动ack,使动静出行列,否则会不绝斲丧
- message.acknowledge();
- }
- } catch (JMSException e) {
- log.error("吸取库存锁定动静报错:"+e.getMessage());
- }
- }
同样,这里我们也是会操作手动确认动静来担保动静的投递靠得住性。
至此,已经所有搞定了。我们看一下和正常的处事挪用对好比何:
1、订单处事不再直接依靠于库存处事,而是将下单变乱发送到MQ中,让库存监听。
2、订单处事能真正的作为一个模块独立运行。
3、办理了并发题目,并且MQ的行列处理赏罚服从很是的高。
可是也存在下面的题目:
1、用户体验改变了:由于行使变乱机制,订单是当即天生的,然则很有也许过一会,体系会提示你没货了。。这就像是列队抢购一样,排着排着就被关照没货了,不消再列队了。
2、数据库也许会存在很对没有完成下单的订单。
最后,假如然的要思量用户体验,而且不想数据库存在许多不须要的数据,该怎么办?
那就把订单处事和库存处事聚合在一路吧。办理当前的题目该当是起主要思量的,我们计划微处事的目标是本想是办理营业并发量。而此刻面对的却是用户体验的题目,以是架构计划也是必要妥协的。
最首要是,我们是颠末思索和说明的,每个方案能做到哪种水平,能应用到哪种场景。正所谓,技能要和现实场景团结,我们不能为了追求新技能而生搬硬套。 (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|