SpringBoot整合 RabbitMQ

SpringBoot整合 RabbitMQ


建springboot项目时导入springboot整合rabbitmq依赖包
在这里插入图片描述

1,生产者

  • application.yml配置文件
spring:
  rabbitmq:
    port: 5672
    password: root
    username: root
    virtual-host: /pms
    host: localhost
    template:
      mandatory: true   #没有投递到队列,强制将消息退回给生产者
    publisher-confirm-type: correlated
    publisher-returns: true
  • RabbitConfig.java
@Configuration
public class RabbitConfg {

    //开启确认,返回
    RabbitTemplate.ConfirmCallback confirmCallback = new RabbitTemplate.ConfirmCallback() {
        @Override
        public void confirm(CorrelationData correlationData, boolean b, String s) {
            System.out.println("消息的Id:" + correlationData.getId());
            if(!b){
                System.out.println("拒收消息的原因:" + s);
            }
        }
    };
    RabbitTemplate.ReturnCallback returnCallback = new RabbitTemplate.ReturnCallback() {
        @Override
        public void returnedMessage(Message message, int i, String s, String s1, String s2) {
            System.out.println("-------------------------------------");
            System.out.println("消息的主体:" + new String(message.getBody()));
            System.out.println("错误码:" + i);
            System.out.println("错误的消息:" +s );
            System.out.println("交换机:" +s1);
            System.out.println("路由Key: " +s2);
            System.out.println("-------------------------------------");
        }
    };

    //配置交换机
    @Bean
    public TopicExchange topicExchange(){
        return new TopicExchange("topic_exchange");
    }
    @Bean
    public TopicExchange orderExchange(){
        return new TopicExchange("order_exchange");
    }

    //对象要用消息转换器(自动注入,需要导入jackson-databind包)
    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory factory){
        RabbitTemplate rabbitTemplate = new RabbitTemplate();
        //设置连接工厂
        rabbitTemplate.setConnectionFactory(factory);
        //设置消息转换器
        rabbitTemplate.setMessageConverter(messageConverter());
        //找不到投递的队列,将消息强制退回给生产者
        rabbitTemplate.setMandatory(true);
        //设置确认机制
        rabbitTemplate.setConfirmCallback(confirmCallback);
        //设置返回机制
        rabbitTemplate.setReturnCallback(returnCallback);
        return rabbitTemplate;
    }

}
  • 生产者
@Component
public class OrderProducer {

    @Autowired
    RabbitTemplate rabbitTemplate;

    public void sendOrder(String exchange, String routingKey, OrderDto orderDto){
        CorrelationData data = new CorrelationData(orderDto.getOrderSn());
        //参数data使用来发送消息的附加参数,用来自定消息id
        rabbitTemplate.convertAndSend(exchange,routingKey,orderDto,data);

    }

}

2,消费者

  • 配置手动签收
spring:
  rabbitmq:
    port: 5672
    username: root
    password: root
    virtual-host: /pms
    host: localhost
    listener:
      simple:
        acknowledge-mode: manual  # 手动签收

消息转换器

@Configuration
public class rabbitConfig implements RabbitListenerConfigurer {

    @Override
    public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) {
        //注册消息处理器工厂
        registrar.setMessageHandlerMethodFactory(messageHandlerMethodFactory());
    }

    //消息处理器方法工厂
    @Bean
    public MessageHandlerMethodFactory messageHandlerMethodFactory(){
        DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
        //设置消息转换器
        factory.setMessageConverter(messageConverter());
        return factory;
    }

    //消息反序列化
    @Bean
    public MappingJackson2MessageConverter messageConverter(){
        return new MappingJackson2MessageConverter();
    }

}
  • 消费者注解方式
@Component
public class MsgConsumer {

    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue(value = "msg_queue",declare = "true",durable = "true",exclusive = "false",autoDelete = "false"),
                    exchange = @Exchange(value = "topic_exchange",durable = "true",autoDelete = "false",type = "topic",declare = "true"),
                    key = "msg.#"
            )
    })
    @RabbitHandler//处理消息的消费者
    //@Payload要处理的消息对象
   public void processMsg(@Payload String msg, Channel channel, @Headers Map header){
        System.out.println("消费者处理消息:" + msg);
        //签收消息要先获取消息的id
        Long tag = (Long) header.get(AmqpHeaders.DELIVERY_TAG);
        try {
            //签收
            channel.basicAck(tag,false);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
  • 消费者方法对象绑定方式
@Component
public class OrderConsumer {

    //队列
    @Bean
    public Queue orderQueue(){
        return new Queue("order_queue",true,false,false);
    }
    //交换机
    @Bean
    public TopicExchange orderExchange(){
        return new TopicExchange("order_exchange");
    }
    //绑定队列到交换机
    @Bean
    public Binding binding(){
        return BindingBuilder.bind(orderQueue()).to(orderExchange()).with("order.#");
    }

    @RabbitListener(queues = "order_queue")
    @RabbitHandler
   public void proccessOrder(@Payload OrderDto orderDto, Channel channel, @Headers Map header){
        System.out.println("消费者处理消息:" + orderDto.getOrderSn()+":" +orderDto.getCreatTime());
        //签收消息
        Long tag = (Long) header.get(AmqpHeaders.DELIVERY_TAG);
        try {
            channel.basicAck(tag,false);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot框架可以很容易地与RabbitMQ进行集成。为了实现这个目标,你需要在项目的依赖项中添加两个关键的依赖项。首先,你需要添加spring-boot-starter-amqp依赖项,它提供了与RabbitMQ进行通信的必要类和方法。其次,你还需要添加spring-boot-starter-web依赖项,以便在项目中使用Web功能。 在你的项目中创建两个Spring Boot应用程序,一个是RabbitMQ的生产者,另一个是消费者。通过这两个应用程序,你可以实现消息的发送和接收。生产者应用程序负责将消息发送到RabbitMQ的消息队列,而消费者应用程序则负责从队列中接收并处理消息。这样,你就可以实现基于RabbitMQ的消息传递系统。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringBoot整合RabbitMQ](https://blog.csdn.net/K_kzj_K/article/details/106642250)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Springboot 整合RabbitMq ,用心看完这一篇就够了](https://blog.csdn.net/qq_35387940/article/details/100514134)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [undefined](undefined)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值