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);
}
```