延迟队列插件

3.10

1.在opt文件夹里建一个rabbitmq文件夹,把插件放进去

2.拷贝到容器内plugins目录下(rabbitmq是容器的name,也可以使用容器id)

复制代码
docker cp /opt/rabbitmq/rabbitmq_delayed_message_exchange-3.10.0.ez rabbitmq:/plugins

进入 Docker 容器

复制代码
docker exec -it rabbitmq /bin/bash

在plugins内启用插件

复制代码
#先执行,解除防火墙限制,增加文件权限
umask 0022
rabbitmq-plugins enable rabbitmq_delayed_message_exchange

退出容器

复制代码
exit

重启 RabbitMQ

复制代码
docker restart rabbitmq

通过UI查看

原理

代码实现,

消费者:自定义了一个延迟交换机,因为spring没有封装,在map集合中指定哪个交换机模版
复制代码
@Configuration
public class DlelayConsumer {
    @Bean //自定义延迟交换机
    public CustomExchange exchange() {

        HashMap<String, Object> args = MapUtil.of("x-delayed-type", "fanout");
//指定交换机类型
        return new CustomExchange("dly_ordering_ok", "x-delayed-message", true,
                false, args);
    }
    @Bean
    public Queue queue() {
        return QueueBuilder.durable("dly_ordering_ok_wms").build();
    }
    @Bean
    public Binding binding() {
        return BindingBuilder.bind(queue()).to(exchange()).with("").noargs();
    }
    //@RabbitListener(queues = "dly_ordering_ok_wms")
    public  void  consume(OrderingOk msg) throws IOException {
        System.out.println("ordering_ok_wms:"+msg);

    }

}
生产者:最后一个参数是给信息设置延迟时间和持久化,.默认是持久化的;
复制代码
@Service
public class DelayProvider {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    public void send(OrderingOk msg) {
        rabbitTemplate.convertAndSend("dly_ordering_ok", "", msg, message -> {
            Long id = msg.getId();
            int delay = 0;
            switch (id.intValue()){
                case 1:
                    delay = 50*1000;
                    break;
                case 2:
                    delay = 40*1000;
                    break;
                case 3:
                    delay = 30*1000;
                    break;
                case 4:
                    delay = 20*1000;
                    break;
                case 5:
                    delay = 10*1000;
                    break;
            }
            message.getMessageProperties().setDelay(delay);//设置延迟时间
            //如果RabbitMQ成功将消息写入磁盘,并且至少被一个交换器接受,那么消息就被认为是持久化的 //设置消息持久化,默认是PERSISTENT
            message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);

            return message;
        });
    }
}
测试:写一个对象让生产者去发送
复制代码
@SpringBootTest
public class DelayTests {
    @Autowired
    private DelayProvider delayProvider;
@Test
    void test() throws IOException {
    for (int i = 1; i < 6; i++) {
        OrderingOk orderingOk = new OrderingOk().setId((long) i).setUserName("张三").setOrderItems(CollUtil.newArrayList(new OrderItem().
                setId(1).setProductId(1).setProductName("苹果").setPrice(BigDecimal.valueOf(10.0)).setQty(12)));
        delayProvider.send(orderingOk);
    }
    System.out.println("发送成功");
    System.in.read();
}
}

#当设置为 CORRELATED 时,Spring Boot会为每个发布的消息生成一个唯一的关联ID,并将这些ID与确认信息相关联。这样,当消息被确认或未被确认时,可以通过关联ID追踪到具体的每条消息。

spring.rabbitmq.publisher-confirm-type = CORRELATED

#当设置为 true 时,如果消息无法被路由到任何一个队列(例如,由于队列不存在或消息的路由键无效),那么RabbitMQ会将这些消息退回给生产者。 这允许生产者处理这些未能正确路由的消息。

spring.rabbitmq.publisher-returns = true

相关推荐
用户0942485680318 分钟前
第3章:OpenJDK从源码到字节码——Class 文件与 javac 管线
java·jvm
azhou的代码园26 分钟前
基于RFM模型的中小型企业客户管理系统
java·人工智能·spring boot·毕业设计
君顾140 分钟前
酒吧点餐小程序系统开发实战:从架构设计到上线全流程指南
java·开发语言·酒吧
子非鱼a1 小时前
【WEB】[SWPU2019]Web1
java·服务器·前端
花生了什么事o1 小时前
自定义Spring Boot Starter全流程
java·spring boot·后端
torpidcat2 小时前
ruoyi-vue-pro 若依芋道 java springboot +mybatis 生日查询相关
java·vue.js·spring boot
AC赳赳老秦2 小时前
文旅市场公开数据分析:基于 OpenClaw 采集景区客流与门票公示数据,生成区域文旅热度监测报告
java·c语言·python·php·symfony·deepseek·openclaw
我命由我123453 小时前
Windows 操作系统 - 启用 D 盘虚拟内存
java·运维·服务器·windows·学习·java-ee·运维开发
xcl09253 小时前
智慧场馆解决方案系统源码:从架构设计到部署实战
java·spring boot
liangbo74 小时前
06-JVM垃圾回收器之CMS
java·jvm