RabbitMQ:SpringBoot整合RabbitMQ

一、导入依赖

dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

二、配置application.xml/yml

我们这里是以我们的电脑windows为例。想要使用虚拟机上的linux系统的话,只需要更改RebbitMQ的broker(服务器)地址即可,如:spring.rabbitmq.host=192.168.127.129。

# 设置RabbitMQ的broker
spring.rabbitmq.host=localhost
# 设置RabbitMQ的虚拟主机
spring.rabbitmq.virtual-host=xlh
# 设置RabbitMQ的帐户
spring.rabbitmq.username=guest
# 设置RabbitMQ的密码
spring.rabbitmq.password=guest

三、SpringBoot为RabbitMQ准备的三样东西

        SpringBoot为我们的RabbitMQ准备了三样东西:

  • RabbitTemplate:管理消息的发送和接收;
  • @RabbitListener:用来监视接收消息
  • AmqpAdmin:用于创建交换器、创建消息队列、实现绑定等操作

一)RabbitTemplate

RabbitTemplate对消息的操作有两种:

  • 文本
  • java对象(常用)

1、文本

发送消息:

参数解释:交换器、路由键、message对象(消息的byte类型数组,消息的类型)

rabbitTemplate.send("dongman.direct","appach",new Message(message.getBytes(),new MessageProperties()));

接收消息:

参数解释:消息队列的名字

由于我们得到的是一个message,我们要再转回文本,则需要使用message的getBody方法,将其转回。

receive方法有个不好的点,就是当队列为空时,再取出会报空指针异常。

Message daxiong = rabbitTemplate.receive("daxiong");
String s = new String(daxiong.getBody());

2、Java对象

其实java对象也能是文本,毕竟java对象有object。

发送消息:

rabbitTemplate.convertAndSend("dongman.direct","appach",message);

接收消息:

相比于receive方法,这个方法当队列为空时,只是返回null,而不是报空指针异常。

Object daxiong = rabbitTemplate.receiveAndConvert("daxiong");

若想以json的格式发送,则只需将原来的消息转换器,由原来的默认转换器SimpleMessageConverter换成Jackson2JsonMessageConverter即可,写一个配置类

package com.example.config;

import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MessageConfig {
    @Bean
    public MessageConverter getConverter(){
        return new Jackson2JsonMessageConverter();
    }
}

二)@RabbitListener 

主要用于监视消息队列啥时候接收到消息

  1. 方法上加上一个注解:@RabbitListener(queues = "daxiong"),注解属性为消息队列名
    @RabbitListener(queues = "daxiong")
    public void receiver(String message){
        System.out.println(message);
    }
    
  2. 再在SpringBoot主启动类上加上一个注解:@EnableRabbit
    @SpringBootApplication
    @EnableRabbit
    public class ReceiverApplication {
    
       public static void main(String[] args) {
          SpringApplication.run(ReceiverApplication.class, args);
       }
    
    }

加上上面两个注解即可,@RabbitListener下的方法参数会自动匹配接收到的消息

三)AmqpAdmin 

主要用于创建交换器、队列、绑定等功能。

1、创建交换器

public void creatExchange(){
    ampqAdmin.declareExchange(new DirectExchange("lufei.direct"));
    ampqAdmin.declareExchange(new FanoutExchange("lufei.fanout"));
    ampqAdmin.declareExchange(new TopicExchange("lufei.topic"));
}

2、创建队列 

public void creatQueue(){
    ampqAdmin.declareQueue(new Queue("suolong"));
}

 3、绑定

参数解释:队列,不知,转换器,路由键,null

public void binding(){
    ampqAdmin.declareBinding(new Binding("suolong",Binding.DestinationType.QUEUE,"lufei.direct","wlygh",null));
}

四、RabbitMQ中的ACK机制 

消费端取出消息,但在操作过程中出现异常导致数据丢失。

RabbitMQ特此推出ACK机制来保护我们的数据。

消费端消费完数据后,给一个反馈给RabbitMQ,RabbitMQ才会从队列中移除数据,反之不移除。

这就出现一种情况,队列中出错的数据一直消费不掉。

我们就出现了即便报错也能消费掉队列中的数据的操作,有两种方法:

1、try...catch捕获异常,给RabbitMQ一个反馈

2、重试机制:设置重试上线次数为两次。第一次取报错,数据返回;第二次取报错,数据返回;第三次取数据报错,数据不返回,从队列中移除。

        重试机制RabbitMQ是默认关闭的,我们需要在application.xml中进行配置

#开启重试机制
spring.rabbitmq.listener.simple.retry.enabled=true
#设置重试次数
spring.rabbitmq.listener.simple.retry.max-attempts=3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值