实现商品有不少方法,今天将要介绍一种方法,使用RabbitMQ的死信队列java
1. 建立死信队列:web
名字:queue.concurrent.test.fixed.len
属性以下:
微信
注意第一个属性是死信交换机是啥,第二个属性是队列中的最大长度
学习
2. 建立死信交换机:spa
名字:exchange.concurrent.test.remain.net
属性以下:code
3. 建立剩余队列:orm
名字:queue.concurrent.test.remain.len队列
秒杀的原理:ci
1. 因为死信队列有最大长度,当处在消息队列的消息长度达到最大值时,就会把余下的消息发送到另外一个队列,则死信队列中的消息就是秒杀成功用户的消息,另外一个队列的消息就是秒杀失败的消息
2. 先不要消费消息,要等到秒杀活动结束后再消费这两个队列的消息,由于一边生产一边消费会使私信队列达不到最大长度,就不能精准保证秒杀成功的用户就是固定值。
代码以下:
@Configuration
public class RabbitConfig {
@Value("${queue.concurrent.test.fixed.len}")
private String secondKillQueueName;
@Value("${exchange.concurrent.test.remain}")
private String deadExchange;
@Bean
public Queue secondKillQueue(){
Map<String, Object> extendArgs = new HashMap<>();
extendArgs.put("x-dead-letter-exchange", deadExchange);
extendArgs.put("x-queue-type", "classic");
extendArgs.put("x-max-length", 200);
Queue queue = new Queue(secondKillQueueName, true, false, false, extendArgs);
return queue;
}
}
@Service
public class RabbitMqSenderService {
@Autowired
private RabbitTemplate template;
public void sendMsgToDeadQueue(String queueName, String msg){
template.convertAndSend(queueName,msg);
}
}
本文分享自微信公众号 - Java学习进阶手册(javastudyup)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。