Springboot消息中間件
Springboot消息中間件有兩種一種是java提供的API:JMS
另外一種跨語言框架:AMPQ
消息中間件執行原理(AMPQ)
中間件消息模式
- 點對點:即一個交換器(exchange)對應一個隊列(Queue)
- 點對面:一個交換器對應多個列表
交換器(exchange)
使用流程
- 自動配置
- 1、RabbitAutoConfiguration
- 2、有自動配置了連接工廠ConnectionFactory;
- 3、RabbitProperties 封裝了 RabbitMQ的配置
- 4、 RabbitTemplate :給RabbitMQ發送和接受消息;
- 5、 AmqpAdmin : RabbitMQ系統管理功能組件;
-
AmqpAdmin:創建和刪除 Queue,Exchange,Binding
- 6、@EnableRabbit + @RabbitListener 監聽消息隊列的內容
案例
配置文件
spring:
rabbitmq:
host: 192.168.1.102
username: guest
password: guest
數據轉爲json數據發送
package com.atguigu.amqp.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 MyAMQPConfig {
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
數據監聽類
對數據監聽要對啓動類使用@EnableRabbit //開啓基於註解的rabbitmq
package edu.yjsj.springboot_01_amqp.service;
/**
* 對rabbitmq監控
*/
import edu.yjsj.springboot_01_amqp.bean.Book;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;
@Service
public class BookService {
@RabbitListener(queues = "yjsj.news")
public void receive(Book book){
System.out.println("收到消息!"+book);
}
}
測試類
package edu.yjsj.springboot_01_amqp;
import edu.yjsj.springboot_01_amqp.bean.Book;
import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@SpringBootTest
class Springboot01AmqpApplicationTests {
@Autowired
RabbitTemplate rabbitTemplate;
// 單播(點對點)
@Test
void contextLoads() {
Map<String,Object> map = new HashMap<>();
List message = Arrays.asList("2020/4/16","星期四");
map.put("data",message);
rabbitTemplate.convertAndSend("exchange.direct","yjsj.news",map);
}
// 單播(點對點)
@Test
void contextLoads1() {
rabbitTemplate.convertAndSend("exchange.direct","yjsj.news",new Book("西遊記","羅貫中"));
}
@Test
void testRabbitMq(){
Object object = rabbitTemplate.receiveAndConvert("yjsj.news");
System.out.println(object == null);
System.out.println(object);
}
// 多播(一對多)
@Test
void testRabbitMq01(){
Map<String,Object> map = new HashMap<>();
List message = Arrays.asList("今天天氣一般");
map.put("data",message);
rabbitTemplate.convertAndSend("exchange.fanout","",map);
}
}
執行結果可以登錄RabbitMQ後臺查看數據結果。