• 项目应用RabbitMQ简单配置


    强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan

    前言

    至于rabbitMQ的安装我就不写了,近期由于项目需求,使用RabbitMQ异步处理数据,为了数据安全,加入死信队列概念保证数据的简单安全性。这里的安全主要是,超时,处理异常这些内容,一旦程序拿到队列中的数据,处理过程中出现了异常,非常有可能导致数据的丢失。

    配置

    队列和交换机之间的关系图简单如下:

    1.建立交换机

    • 建立生产者交换机

    • 建立死信交换机

    2.建立队列

    • 生产者队列

    • 建立死信队列

    3.交换机与队列之间绑定

    • 在生产者队列中绑定生产者交换机

    • 在死信队列中绑定死信交换机

    代码实例测试

    添加rabbitmq的配置文件

    spring配置文件加载rabbitmq的配置文件

        
    
    • 1

    测试rabbitmq的生产者代码

    @Autowired
    private RabbitTemplate template;
    
     /**
         * 测试rabbitmq
         * @throws JsonProcessingException 异常信息
         */
        @Override
        public void test() throws JsonProcessingException {
            ChooseCourseMQModel chooseCourseMQModel = new ChooseCourseMQModel("13060141059", "123", CourseTypeEnum.ADD_CHOOSE_COURSE);
    
            Message msg = MessageBuilder
                    .withBody(SerializationUtils.serialize(chooseCourseMQModel))
                    .build();
            template.convertAndSend(msg);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    消费者:

    public class MqConsumer implements ChannelAwareMessageListener {
       
        @Override
        @Transactional(rollbackFor = Exception.class)
        public void onMessage(Message message, Channel channel) throws Exception {
            System.out.println("message:" + message);
            long deliveryTag = message.getMessageProperties().getDeliveryTag();
            System.out.println("---msg recv:" + message.toString());
            try {
                ChooseCourseMQModel chooseCourseMQModel = (ChooseCourseMQModel) SerializationUtils.deserialize(message.getBody());
                //业务代码,处理正确,发送确认信息,basicAck
                if{
                        channel.basicAck(deliveryTag, false);
                    
                } else {  //处理失败则发送拒绝信息,放入死信队列
                    channel.basicReject(deliveryTag, false);
                    return;
                }
            } catch (Exception e) {  //处理发生异常则放入死信队列,发送basicReject
                System.out.println("error:" + e);
                channel.basicReject(deliveryTag, false);
            }
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    简单的应用到此已经结束了,建立之后可以在消费者中的try语句块中写一个异常,然后发现生产者队列中的数据通过死信交换机到达死信队列,然后根据业务场景,可以重试或者写一个定时任务重新处理,保证异步处理数据的正确性和稳定性!

  • 相关阅读:
    OSPF协议
    7.4 条件变量示例
    C语言---预处理详解
    MPPNet Transformer部分详解
    怎么管理员工混工时的现象?
    秋招入职阿里腾讯大厂,阿里淘系内传322页“Java并发编程核心讲义”学习笔记,轻松拿下大厂offer
    尚品汇 - 项目个人笔记总汇(更新中...)
    【管理运筹学】第 5 章 | 整数规划(4,指派问题)
    深度估计 双目深度估计+单目深度估计 ONNX运行程序
    Kafka 万亿级消息实践之资源组流量掉零故障排查分析
  • 原文地址:https://blog.csdn.net/m0_67401055/article/details/126620300