spring boot 2.6.3快速集成RabbitMq 踩坑点(Win10)

Rabbit下载和安装

在win10系统安装RabbitMq是需要erlang环境的,选择安装目录一直下一步就行了

链接: https://pan.baidu.com/s/1qM5N7bqOwoIg0ckw4vtzuA
提取码: fc8h

安装完成之后可以看到如下信息,然后启动服务访问 http://localhost:15672 便可看到可视化控制台,默认账号密码都是 guest
在这里插入图片描述


spring boot快速集成RabbitMq

依赖

  <dependency>
   	  <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-amqp</artifactId>
  </dependency>
  <dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
       <artifactId>jackson-datatype-jsr310</artifactId>
  </dependency>
  <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-core</artifactId>
   </dependency>
   <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-annotations</artifactId>
   </dependency>
   <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
  </dependency>

yaml配置

spring:
  rabbitmq:
    host: localhost
    port: 5672
    publisher-returns: true 
    publisher-confirm-type: correlated #确认机制类型
    #publisher-confirms: true 		  改用上面配置
    listener:
      simple:
        acknowledge-mode: manual #ack为手动应答方式
        retry:
          max-attempts: 3 #重试最大次数
          enabled: true   #开启重试

不要忘记在Spring boot上面加上 @EnableRabbit 注解


RabbitMq 相关配置(可能出现循环依赖问题和Java)

@Configuration
public class RabbitConfiguration  {

    /**
     * 配置消息转换器
     * @return
     */
    @Bean
    public MessageConverter getMessageConverter(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);
        return new Jackson2JsonMessageConverter(objectMapper);
    }

    /*
    出现 Java 8 date/time type `java.time.LocalDateTime` 异常
    @Bean
    public MessageConverter getMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }*/

	//此处不配置Rabbit callBack回调是因为会出现循环依赖问题
}

Rabbit Mq发送端确认机制回调处理

@Component
public class RabbitCallbackConfiguration {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 定制RabbitTemplate
     * 服务收到消息就回调ConfirmCallback
     */
    @PostConstruct
    public void initRabbitTemplate() {
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {

            /**
             * 1、只要消息抵达Broker就ack=true  服务器收到了
             *
             * @param correlationData 当前消息的唯一关联数据
             * @param ack 消息是否成功收到
             * @param cause 失败原因
             */
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                /**
                 * 1、做好消息确认机制(publisher,consumer【手动ack】)
                 * 2、每一个发送的消息都在数据库做好记录,定期将失败的消息再次发送
                 */
                if (!ack) {
                    System.out.println("correlationData【" + correlationData + "】===>ack【" + ack + "】===>cause【" + cause + "】");
                }
            }
        });

        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {

            /**
             * 只要消息没有投递给指定的队列,就会触发这个失败回调
             * @param message     投递失败的消息详细信息
             * @param replyCode   回复的状态码
             * @param replyText   回复的文本内容
             * @param exchange    当时这个消息发给那个交换机
             * @param routingKey  当时这个消息用哪个路由键
             */
            @Override
            public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
                System.out.println("message【" + message + "】===>replyCode【" + replyCode + "】===>replyText【" + replyText + "】===》exchange【" + exchange + "】===》routingKey【" + routingKey + "】");
            }
        });
    }
}

Rabbit Mq发送消息和接收消息

@Autowired
private RabbitTemplate rabbitTemplate;

public void sendUserAccountData() {
        //交换机 - routingKey - 消息
      rabbitTemplate.convertAndSend("sourceUserDataExchange", "userKey", "hello Wold");
}
@Component
public class SourceUserAccountDataListener {

    @RabbitListener(queues = "队列")
    public void userAccountListener(JssdmallUserAccount jssdmallUserAccount, Channel channel, Message message) {
        try {
            //相关业务处理

			//手动Ack应答处理
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (Exception e) {
            try {
                //手动Ack应答处理,重新回队列
                channel.basicReject(message.getMessageProperties().getDeliveryTag(), true);
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        }
    }
}

关于Spring boot 2.6.3集成 RabbitMq 消息转换器配置和发送端回调处理踩坑点以上解决思路。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值