導(dǎo)入配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.7.7</version>
</dependency>
配置文件配置
JavaConfig配置
@Component
@Slf4j
public class RabbitmqConfig implements InitializingBean {
@Resource
private RabbitTemplate rabbitTemplate;
@Override
public void afterPropertiesSet() throws Exception {
log.info("初始化配置rabbitmq配置");
// rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter(new ObjectMapper()));
rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
@Override
public void confirm(CorrelationData correlationData, boolean b, String s) {
if(!b)
{
log.error("發(fā)送消息到mq失敗,原因:{}",s);
}
}
});
rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
log.error("消息返回回調(diào)觸發(fā),交換機:{},路由:{},消息內(nèi)容:{},原因:{}",exchange,routingKey,message,replyText);
}
});
}
}
通過@Bean注入MessageConverter,保證消息的正確傳輸
@Bean
public MessageConverter jsonMessageConverter(ObjectMapper objectMapper) {
return new Jackson2JsonMessageConverter(objectMapper);
}
修改后的代碼文章來源:http://www.zghlxwxcb.cn/news/detail-852699.html
@Override
//關(guān)于事務(wù)注解
public Result seckillVoucher(Long voucherId) {
// 1,執(zhí)行l(wèi)ua腳本,lua腳本用于判斷庫存是否充足,扣庫存操作
Long userId=UserHolder.getUser().getId();
long orderId=redisIDworker.nextId("order");
//執(zhí)行此操作前保證,用戶查看優(yōu)惠券的請求,和添加優(yōu)惠券時 已經(jīng)將秒殺優(yōu)惠圈的庫存數(shù)量添加到了redis中
Long result=stringRedisTemplate.execute(
SECKILL_SCRIPT,
Collections.emptyList(),
voucherId.toString(),
userId.toString(),
String.valueOf(orderId)
);
//獲取lua腳本返回值
int r=result.intValue();
if(r!=0)
{
return Result.fail(r==1?"庫存不足":"不能重復(fù)下單");
}
// //獲取代理對象
// IVoucherOrderService proxy= (IVoucherOrderService) AopContext.currentProxy();
//異步寫數(shù)據(jù)庫
VoucherOrder voucherOrder = new VoucherOrder();
voucherOrder.setId(orderId);
voucherOrder.setUserId(userId);
voucherOrder.setVoucherId(voucherId);
rabbitTemplate.convertAndSend(SaveVoucherConstants.SECKILL_VOUCHER_SAVE_QUEUE,voucherOrder);
log.info("發(fā)送保存秒殺券訂單信息成功:{}",orderId);
return Result.ok("seckSuccess");
}
監(jiān)聽器文章來源地址http://www.zghlxwxcb.cn/news/detail-852699.html
@Component
@Slf4j
public class AsyncSaveVoucherListener {
@Resource
private IVoucherOrderService voucherOrderService;
@Resource
private ISeckillVoucherService seckillVoucherService;
@RabbitListener(queuesToDeclare = {@Queue(name= SaveVoucherConstants.SECKILL_VOUCHER_SAVE_QUEUE)})
public void AsyncSave(VoucherOrder voucherOrder)
{
log.info("接收到存儲訂單信息的消息,{}", JSON.toJSON(voucherOrder).toString());
boolean success = seckillVoucherService.update().setSql("stock=stock-1").eq("voucher_id", voucherOrder.getVoucherId()).gt("stock", 0).update();
voucherOrderService.save(voucherOrder);
log.info("訂單信息存儲完成?{}",success);
}
}
到了這里,關(guān)于黑馬點評用rabbitmq實現(xiàn)優(yōu)惠券秒殺下單后的異步操作數(shù)據(jù)庫數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!