上班就要干活给客户解决问题
场景:客户有需求需要做订单超时功能,在超时范围内的时间都可以进行支付操作因为最近在做java web方向开发,第一时间就想到了定时器解决,但是考虑性能还
是放弃了,在经过百度的海洋中发现rabbitmq可以实现此需求好像还不错就使用此款方案了,初步查看百度或一些文档得知rabbitmq 可以用一种叫死信队列的方式实
现,经过测试这种实现方式有个问题,比如说生产一条10秒超时的消息,再立刻生产一条5秒的超时消息,会出现异常后者的消息无法消费,这种场景需求还是有的,
所以继续探索其他方案。最后找到rabbitmq 延时队列插件实现方式,原来rabbitmq已经通过插件方式实现了怎么安装就不多说了网上一大堆,最后有这种类型就对了。
队列配置类
@Configuration
public class QueueConfiguration {
@Bean
public Queue demoQueue(){
return new Queue("DEMO",true);
}
@Bean
public Binding demoBinding(Queue demoQueue,CustomExchange cfgUserDelayExchange){
return BindingBuilder.bind(demoQueue()).to(cfgUserDelayExchange).with("DEMO").noargs();
}
}
队列监听类
@Component
public class ReceiverMessageDemo {
@RabbitListener(queues = "DEMO")
public void process(Message message, Channel channel) throws IOException {
try {
// 消息内容
String content = new String(message.getBody(), "UTF-8");
System.out.println("测试接收消息 "+content);
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
}
}
}
生产消息方法 可以把它封装个service
//10000 == 10触发监听
rabbitTemplate.convertAndSend("delay_exchange", "DEMO", messages, message -> { message.getMessageProperties().setHeader("x-delay", 10000); return message; });
如果感觉消费消息的慢可以通过简单的增加‘队列监听类’ 缓解(就是复制几份队列监听类监听同一队列),经过测试确有提速,速度大部分还是和队列的持久化设置有关。
注意消费者类不能超过配置文件的配置spring.rabbitmq.listener.simple.max-concurrency
队列操作还远不如此,继续前中。。。。