RabbitMQ使用入门

79 阅读1分钟

一、工程准备

  1. 引入依赖
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

Spring-boot提供的rabbitMQ启动器

  1. 添加rabbitMQ连接配置
spring:
  application:
    name: consumer
  rabbitmq:
    host: 192.168.0.1
    port: 5672
    username: zhangsan
    password: 123456
    virtual-host: /  #虚拟主机名字
    listener:
      simple:
        prefetch: 1 #每次从队列中获取一条,处理完后才能获取到下一条
  1. 生产者自定义MessageConverter
    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }

Spring的对消息对象的处理是由org.springframework.amqp.support.converter.MessageConverter来处理的。而默认实现是SimpleMessageConverter,基于JDK的ObjectOutputStream完成序列化。修改只需要定义一个MessageConverter 类型的Bean即可,推荐用JSON方式序列化。

自定义MessageConverter是为了更改content_type类型,原始是application/x-java-serialized-object,可读性差,并且所传输的字节量也比较大。

引入fastjson后,重新自定义MessageConverter,使传输类型成为application/json,提高可读性和减少传输字节量,提高性能。

image-20230305194509548

二、选定交换机类型

  • Fanout exchange 广播型
  • Direct exchang 路由型
  • Topic exchang 主题型

1、Fanout exchange广播型

顾名思义,就是将生产者的消息转发给所有绑定该交换机的队列。

image-20230305202227520

生产者:

    public void sendFanoutExchange() {
        String exchangeName = "fanout.exchange";
        String message = "hello,everyone!";
        rabbitTemplate.convertAndSend(exchangeName, "", message);
    }

消费者:

@RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "fanout.queue"),
            exchange = @Exchange(name = "fanout.exchange", type = ExchangeTypes.FANOUT)
    ))
    public void rabbitFanoutListener(String message) {
        System.out.println("接受到fanout消息:" + message);
    }

2、Direct exchang 路由型

image-20230305202419287

生产者:

    public void sendDirectExchange() {
        String exchangeName = "direct.exchange";
        String message = "hello,blue!";
        rabbitTemplate.convertAndSend(exchangeName, "blue", message);
    }

消费者:

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "direct.queue"),
            exchange = @Exchange(name = "direct.exchange", type = ExchangeTypes.DIRECT),
            key = {"blue"}
    ))
    public void rabbitDiRectListener(String message) {
        System.out.println("接受到消息:" + message);
    }

3、Topic exchange 主题型

image-20230305202816497

生产者:

	public void sendTopicExchange() {
        String exchangeName = "topic.exchange";
        String message = "hello,news!";
        rabbitTemplate.convertAndSend(exchangeName, "china.news", message);
    }

消费者:

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "topic.queue"),
            exchange = @Exchange(name = "topic.exchange",type = ExchangeTypes.TOPIC),
            key = "#.news"
    ))
    public void rabbitTopicListening(String message) {
        System.out.println("接受到消息:" + message);
    }