RabbitMQ延迟队列
可以用死信队列实现延迟队列,这里不展开,只讲一下利用插件的方式
在 RabbitMQ 的 3.5.7 版本之后,提供了一个插件( rabbitmq-delayed-message-exchange )来实现延迟队列 ,同时需保证 Erlang/OPT 版本为 18.0 之后。
安装延迟队列插件
1. RabbitMQ版本在 3.5.7-3.7.x 的可以执行以下命令进行下载(也可以直接通过浏览器下载):
wget https://bintray.com/rabbitmq/community-plugins/download_file?file_path=rabbitmq_delayed_message_exchange-0.0.1.ez
如果 RabbitMQ 是 3.8 之后的版本,可以点击这里,找到延迟队列对应版本的插件,然后下载。
2. 下载好之后,将插件上传到 plugins 目录下,执行 rabbitmq-plugins enable rabbitmq_delayed_message_exchange 命令启动插件。如果要禁止该插件,则可以执行命令 rabbitmq-plugins disable rabbitmq_delayed_message_exchange (启用插件后需要重启 RabbitMQ 才会生效)。
PS:如果是docker容器可以下面的命令把文件复制进容器内
docker cp rabbitmq_delayed_message_exchange-3.10.2.ez bccff492754f:/plugins
延迟队列插件示例
1. 新建一个 PluginDelayRabbitConfig 配置类:
@Configuration public class PluginDelayRabbitConfig { @Bean("pluginDelayExchange") public CustomExchange pluginDelayExchange() { Map<String, Object> argMap = new HashMap<>(); argMap.put("x-delayed-type", "direct");//必须要配置这个类型,可以是direct,topic和fanout //第二个参数必须为x-delayed-message return new CustomExchange("PLUGIN_DELAY_EXCHANGE","x-delayed-message",false, false, argMap); } @Bean("pluginDelayQueue") public Queue pluginDelayQueue(){ return new Queue("PLUGIN_DELAY_QUEUE"); } @Bean public Binding pluginDelayBinding(@Qualifier("pluginDelayQueue") Queue queue,@Qualifier("pluginDelayExchange") CustomExchange customExchange){ return BindingBuilder.bind(queue).to(customExchange).with("delay").noargs(); } }
2. 新建一个消费者类 PluginDelayConsumer :
@Component public class PluginDelayConsumer { @RabbitHandler @RabbitListener(queues = "PLUGIN_DELAY_QUEUE")//监听延时队列 public void fanoutConsumer(String msg){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("【插件延迟队列】【" + sdf.format(new Date()) + "】收到消息:" + msg); } }
3. 新建 DelayQueueController 类,新增一个方法:
@GetMapping(value="/plugin/send") public String pluginMsgSend(@RequestParam(value = "msg",defaultValue = "no message") String msg){ MessageProperties messageProperties = new MessageProperties(); messageProperties.setHeader("x-delay",5000);//延迟5秒被删除 Message message = new Message(msg.getBytes(), messageProperties); amqpTemplate.convertAndSend("PLUGIN_DELAY_EXCHANGE","delay",message);//交换机和路由键必须和配置文件类中保持一致 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("消息发送成功【" + sdf.format(new Date()) + "】"); return "succ"; }
4. 接下来就可以访问地址 http://localhost:8080/delay/plugin/send?msg=插件延迟队列消息 进行测试,可以看到,消息在延时 5 秒之后被消费

原文链接:https://www.cnblogs.com/lonely-wolf/p/14368920.html

浙公网安备 33010602011771号