document
API test

发送消息

POST

Description or Example

# 知识点 ## 为什么保存一个TO? > 这里保存一个TO主要是出于区分的角度, 由后面的业务可知, 该队列里面会存储两种数据类型的数据, 一种主要用于被动解锁库存, 一种主动批量解锁库存, 为了区分, 所以保存一个TO ## 为什么仅仅保存工作单与工作单详情的ID > 这里重点是仅仅保存工作单详情的ID, 因为当ware微服务的锁定库存发生异常时(没有足够的库存锁定), 由于本地事务的原因, 订单, 订单详情, 工作单, 工作单详情通通回滚, 什么都没发生过, **此刻还保存整个工作单详情是完全没必要的, 因为工作单详情里面的数据都没用了, 因为已经异常回滚了, 不需要你去回滚** # 核心代码 ```java @RequestMapping("/ware/send/wareTo") public R sendBatchMessage(@RequestBody List<WareTO> wareTOS) { try { wareSender.sendBatch(wareTOS); } catch (AmqpException e) { log.error("发送消息失败"); } return R.ok(); } @RequestMapping("/order/send/{orderSn}") public R sendMessageWithOrder(@PathVariable String orderSn) { try { orderSender.sendOrderMsg(orderSn); } catch (AmqpException e) { log.error("发送消息失败"); } return R.ok(); } ``` ```java /** * 被动解锁库存 * @param wareTOS * @throws AmqpException */ public void sendBatch(List<WareTO> wareTOS) throws AmqpException { if (wareTOS != null && !wareTOS.isEmpty()) { for (WareTO wareTO: wareTOS) { sendMsgUtil.convertAndSendAndSaveLog("stock-event-exchange", "stock-lock", wareTO); } } } /** * 主动解锁库存 * @param orderSn */ public void sendMsgWithOrderToRelease(String orderSn) { sendMsgUtil.convertAndSendAndSaveLog("stock-event-exchange", "stock-release-#", orderSn); } ``` ```java @Component /** * 处理秒杀商品的消息 * @param secKillOrderTO */ public void sendSeckillOrder(SecKillOrderTO secKillOrderTO) { sendMsgUtil.convertAndSendAndSaveLog("order-event-exchange", "order-secKill-order", secKillOrderTO); } /** * 发送释放信号量的消息 * @param orderSn */ public void sendReleaseSemaphore(String orderSn) { sendMsgUtil.convertAndSendAndSaveLog("order-event-exchange", "order-seckill-semaphore", orderSn); } ```