RabbitMQ整合springboot项目(一)---延迟队列

一、导入依赖

<!--springboot依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>        
<!--springboot测试依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<!--RabbitMQ依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
    <version>2.1.3.RELEASE</version>
</dependency>
<!--lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
</dependency>
<!--fastjson-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.78</version>
</dependency>
<!--Rabbitmq测试依赖-->
<dependency>
    <groupId>org.springframework.amqp</groupId>
    <artifactId>spring-rabbit-test</artifactId>
    <version>2.3.9</version>
</dependency>

二、队列配置文件

需要一台普通交换机,一台死信交换机,两个普通队列,一个死信队列,在普通队列设置参数绑定死信交换机,并设置过期时间(多少毫秒后队列未接收到消息则发给死信交换机)

        //设置死信交换机
        arguments.put("x-dead-letter-exchange", Y_DEAD_LETTER_EXCHANGE);
        //设置死信交换机的routing-key
        arguments.put("x-dead-letter-routing-key", "dead_key");
        //设置过期时间
        arguments.put("x-message-ttl", 10000);
@Configuration
public class TtlQueueConfig {
    //普通交换机
    private static final String X_EXCHANGE ="X";
    //延迟交换机
    private static final String Y_DEAD_LETTER_EXCHANGE ="Y";
    //普通队列
    private static final String QUEUE_A ="QA";
    private static final String QUEUE_B ="QB";
    //优化队列  不设置过期时间
    private static final String QUEUE_C ="QC";
    //死信队列
    private static final String QUEUE_D ="QD";

    //声明交换机
    @Bean("xExchange")
    public DirectExchange xExchange() {
        return new DirectExchange(X_EXCHANGE);
    }

    @Bean("yExchange")
    public DirectExchange yExchange() {
        return new DirectExchange(Y_DEAD_LETTER_EXCHANGE);
    }

    //声明普通队列A
    @Bean("queueA")
    public Queue queueA() {
        Map<String, Object> arguments = new HashMap<>();
        //设置死信交换机
        arguments.put("x-dead-letter-exchange", Y_DEAD_LETTER_EXCHANGE);
        //设置死信交换机的routing-key
        arguments.put("x-dead-letter-routing-key", "dead_key");
        //设置过期时间
        arguments.put("x-message-ttl", 10000);
        //设置队列长度
        //arguments.put("x-max-length", 6)
        return QueueBuilder.durable(QUEUE_A).withArguments(arguments).build();
    }

    //声明普通队列B
    @Bean("queueB")
    public Queue queueB() {
        Map<String, Object> arguments = new HashMap<>();
        //设置死信交换机
        arguments.put("x-dead-letter-exchange", Y_DEAD_LETTER_EXCHANGE);
        //设置死信交换机的routing-key
        arguments.put("x-dead-letter-routing-key", "dead_key");
        //设置过期时间
        arguments.put("x-message-ttl", 40000);
        return QueueBuilder.durable(QUEUE_B).withArguments(arguments).build();
    }
    //声明优化普通队列C
    @Bean("queueC")
    public Queue queueC() {
        Map<String, Object> arguments = new HashMap<>();
        //设置死信交换机
        arguments.put("x-dead-letter-exchange", Y_DEAD_LETTER_EXCHANGE);
        //设置死信交换机的routing-key
        arguments.put("x-dead-letter-routing-key", "dead_key");

        return QueueBuilder.durable(QUEUE_C).withArguments(arguments).build();
    }

    //声明死信队列D
    @Bean("queueD")
    public Queue queueD() {
        return QueueBuilder.durable(QUEUE_D).build();
    }

    //绑定交换机
    @Bean
    public Binding queueABindingX(@Qualifier("queueA") Queue queueA,
                                  @Qualifier("xExchange") DirectExchange xExchange) {
        return BindingBuilder.bind(queueA).to(xExchange).with("XA");
    }
    @Bean
    public Binding queueBBindingX(@Qualifier("queueB") Queue queueB,
                                  @Qualifier("xExchange") DirectExchange xExchange) {
        return BindingBuilder.bind(queueB).to(xExchange).with("XB");
    }
    @Bean
    public Binding queueDBindingY(@Qualifier("queueD") Queue queueD,
                                  @Qualifier("yExchange") DirectExchange yExchange) {
        return BindingBuilder.bind(queueD).to(yExchange).with("dead_key");
    }
    @Bean
    public Binding queueCBindingX(@Qualifier("queueC") Queue queueC,
                                  @Qualifier("xExchange") DirectExchange yExchange) {
        return BindingBuilder.bind(queueC).to(yExchange).with("XC");
    }
}

 三、生产者

    //只发送消息内容
    @GetMapping("/send")
    public void send(@RequestParam("message") String message) {
        log.info("当前时间 {}, 发送信息: {}",new Date().toString(), message);
        rabbitTemplate.convertAndSend("X", "XA", "10s延迟"+message);
        rabbitTemplate.convertAndSend("X", "XB", "40s延迟"+message);
    }

四、消费者

@Slf4j
@Component
public class DeadLetterReceive {
    @RabbitListener(queues = "QD")
    public void receiveD(Message message, Channel channel) {
        String meg = new String(message.getBody());
        log.info("死信队列==当前时间{}, 接收到延迟消息{}", new Date().toString(), meg);
    }
}

五、优化

将设置消息的延迟时间交给生产者设置,不在消费者中设置

可以在消费者中删除代码

        //设置过期时间
        arguments.put("x-message-ttl", 10000);

 生产者代码改为:

    @GetMapping("/sendMsgWithTime")
    //发送消息并设置过期时间
    public void sendMsgWithTime(@RequestParam("message") String message,
                                @RequestParam("time") String time) {
        log.info("当前时间 {}, 时间为{},发送信息: {}",new Date().toString(),time, message);
        rabbitTemplate.convertAndSend("X", "XC",
                            time+"毫秒延迟"+message, msg->{
            //设置发送消息的延迟时长
            msg.getMessageProperties().setExpiration(time);
            return msg;
                });
    }
### 解决 PP-OCRv4 出现的错误 当遇到 `WARNING: The pretrained params backbone.blocks2.0.dw_conv.lab.scale not in model` 这样的警告时,这通常意味着预训练模型中的某些参数未能匹配到当前配置下的模型结构中[^2]。 对于此问题的一个有效解决方案是采用特定配置文件来适配预训练权重。具体操作方法如下: 通过指定配置文件 `ch_PP-OCRv4_det_student.yml` 并利用已有的最佳精度预训练模型 (`best_accuracy`) 来启动训练过程可以绕过上述不兼容的问题。执行命令如下所示: ```bash python3 tools/train.py -c configs/det/ch_PP-OCRv4/ch_PP-OCRv4_det_student.yml ``` 该方案不仅解决了参数缺失带来的警告,还能够继续基于高质量的预训练成果进行微调,从而提升最终检测效果。 关于蒸馏的概念,在机器学习领域内指的是将大型复杂网络(teacher 模型)的知识迁移到小型简单网络(student 模型)。这里 student 和 teacher 的关系是指两个不同规模或架构的神经网络之间的指导与被指导的关系;其中 teacher 已经经过充分训练并具有良好的性能,而 student 则试图模仿前者的行为模式以达到相似的效果但保持更高效的计算特性。 至于提到的 `Traceback` 错误信息部分,由于未提供具体的跟踪堆栈详情,难以给出针对性建议。不过一般而言,这报错往往涉及代码逻辑错误或是环境配置不当等问题。为了更好地帮助定位和解决问题,推荐记录完整的异常日志,并仔细检查最近修改过的代码片段以及确认依赖库版本的一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值