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("exchange.direct");
    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");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章