SpringBoot -整合RabbitMQ及基本使用

RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue Protocol)的开源实现。

整合RabbitMq

一、引入依赖以及配置

1、引入依赖

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

2、配置yml

spring:
  rabbitmq:
    host: localhost      # 连接地址
    username: guest      # 账号
    password: guest      # 密码
#    port: 5672          # 端口    - 默认5672
#	virtual-host: /      # 虚拟主机 - 配置文件配置了的 /
二、SpringBoot自动配置做了些什么

RabbitAutoConfiguration自动配置了连接工厂ConnectionFactory,在RabbitProperties里封装了RabbitMQ的配置。为我们提供了RabbitTemplate来进行发送和接收消息。
RabbitProperties

三、接收与发送消息

需要注入RabbitMQTemplate
1、点对点(Direct)
RabbitMQ发送消息可以通过RabbitTemplate来做。其中send()方法,需要三个参数exchangerouteKeymessage,其中message需要自己构建并定义消息体内容和消息头。
convertAndSend的第三个参数是Object,它会把Object当做消息体,只需要传入发送的对象,就会自动序列化发送给RabbitMQ。
接收消息可以通过receiveAndConvert来接收消息并序列化回来。接收消息只需要知道队列名即可。
①发送消息

/**
 * 单播(点对点)
 */
@Test
public void contextLoads(){
    Map map = new HashMap<>();
    map.put("msg","这是第一个消息");
    map.put("data", Arrays.asList("helloRabbit",123,true));
    // 对象需要实现序列化接口
    map.put("user",new User("柳成荫",12));
    // 对象被序列化以后发送出去
    // 参数分别是:交换器名、路由键名、消息
    rabbitTemplate.convertAndSend("exchange.direct","lcy.message",map);
}

RabbitMQ Management可以看到,经过Java序列化后的数据,长这个样子
序列化的数据
②接收消息

@Test
public void receive(){
    Object o = rabbitTemplate.receiveAndConvert("atguigu.news");
    System.out.println("消息类型:" + o.getClass());
    System.out.println(o);
}

接收消息
2、分列模式(fanout)
分列模式发送消息不需要routeKey,只需要exchangeobject即可。它会把消息下发到这个exchange绑定的所有队列。

/**
 * 分列(发布)
 */
@Test
public void contextLoads(){
    Map map = new HashMap<>();
    map.put("msg","这是第一个消息");
    map.put("data", Arrays.asList("helloRabbit",123,true));
    // 对象需要实现序列化接口
    map.put("user",new User("柳成荫",12));
    // 对象被序列化以后发送出去
    // 参数分别是:交换器名、路由键名、消息
    rabbitTemplate.convertAndSend("exchange.fanout","",map);
}

接收消息都是一样的,接收对应队列的消息即可。

四、JSON序列化

RabbitMQ默认的是Java的序列化,我们可以自己配置Jackson2JsonMessageConverter来进行JSON序列化。
创建一个AMQPConfig配置类,如下

@Configuration
public class AMQPConfig {
    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }
}

这样发送的消息,就会使用JSON序列化放到队列中去,而接收也可以正常接收到对象。

五、监听消息

很多场景,我们需要监听到消息,根据消息内容去做一些业务。在SpringBoot中只需要给启动类上面加上@EnableRabbit注解,并在想要接收消息的方法上面添加@RabbitListener注解即可。

@Service
public class BlogServiceImpl{
	// 指定监听的队列
	@RabbitListener(queues = "lcy.message")
	public void receive(User user){
		System.out.println("收到消息:" + user);
	}
}

另外一种接收消息的方式

@RabbitListener(queue = "lcy.message")
public void receive(Message message){
    // 消息内容
	System.out.println(message.getBody);
	// 消息头信息
	System.out.println(message.getMessageProperties());
}
六、管理组件的使用

需要注入AmqpAdmin

 @Test
public void createExchange(){
    // 创建交换器 - Direct类型,名为amqpadmin.exchange
    amqpAdmin.declareExchange(new DirectExchange("amqpadmin.exchange"));
    // 创建队列 - 指定队列名和持久化
    amqpAdmin.declareQueue(new Queue("amqpadmin.queue",true));
    // 配置绑定规则,绑定交换器和队列
    // 参数:队列名、队列类型、交换器、路由名、参数(头信息)
    amqpAdmin.declareBinding(new Binding("amqpadmin.queue",Binding.DestinationType.QUEUE,"amqpadmin.exchange","amqpadmiin.queue",null));

    // 删除绑定
    amqpAdmin.declareBinding(new Binding("amqpadmin.queue",Binding.DestinationType.QUEUE,"amqpadmin.exchange","amqpadmiin.queue",null));
    // 删除交换器
    amqpAdmin.declareExchange(new DirectExchange("amqpadmin.exchange"));
    // 删除队列
    amqpAdmin.deleteQueue("amqpadmin.queue");
}
发布了100 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40885085/article/details/104966002