上面兩篇文章已簡單介紹了rabbitMq的安裝和與其它消息中間件的區別。
詳見:
現在簡單介紹下rabbitMq在SpringBoot中的使用。
一、引入依賴
SpringBoot已經默認整合了rabbitMq自動配置,只需要引入簡單的依賴即可
<!-- rabbitMq -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
我的Springboot默認版本2.1.9.RELEASE
二、新增RabbitMqController測試類
- 注入RabbitTemplate類, RabbitTemplate是消息發送處理組件。
@Autowired
private RabbitTemplate rabbitTemplate;
- 新增單播模式的發送和接收方法
/**
* 發送rabbitMq消息--單播模式
*
* @Author ZHANGCHAO
* @Date 2020/3/4 17:05
* @param
* @retrun void
**/
@GetMapping("/send")
public void sendMqDirect() {
Map<String,Object> map = new HashMap<>();
map.put("msg","這是第一條消息");
map.put("data", Arrays.asList("ggg",123,999L,888d));
// rabbitTemplate.convertAndSend("exchange.direct","atguigu.news",map);
GyUser user = new GyUser();
user.setUserName("臥草啊");
user.setPassWord("666666");
user.setAddress("山東省章丘市龍山街道辦");
rabbitTemplate.convertAndSend("exchange.direct","atguigu.news",user);
}
/**
* 接收rabbitMq消息--單播模式
*
* @Author ZHANGCHAO
* @Date 2020/3/4 17:05
* @param
* @retrun void
**/
@GetMapping("/receive")
public ResponseMessage receiveMqDirect() {
Object object = rabbitTemplate.receiveAndConvert("atguigu.news");
System.out.println(object.getClass());
return new ResponseMessage(true,object);
}
- 廣播模式,和單播模式大同小異,不設置路由鍵
/**
* 廣播模式
*
* @Author ZHANGCHAO
* @Date 2020/3/5 8:18
* @param
* @retrun void
**/
@RequestMapping("/sendFanout")
public void sendMqFanout() {
GyUser user = new GyUser();
user.setUserName("李巖劉露啊啊啊");
user.setPassWord("666666");
user.setAddress("山東省章丘市");
rabbitTemplate.convertAndSend("exchange.fanout","",user);
}
二、rabbitMq的轉換器序列化方式是用的jdk的,可讀性差,換成Jackson。
新建MyRabbitMqConfig配置類,配置MessageConverter類
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;
/**
* @program sweet-dream
* @description: rabbitMq配置類
* @author: zhangchao
* @date: 2020/03/04 20:36
* @since: 1.0.0
*/
@Configuration
public class MyRabbitMqConfig {
@Bean
public MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}
}
三、application.properties配置rabbitMq的地址、用戶名密碼等信息
## rabbitmq配置 ##
spring.rabbitmq.host=115.188.188.188
spring.rabbitmq.username=root
spring.rabbitmq.password=999999
#端口號可以省略,默認就是5672
spring.rabbitmq.port=5672
四、開啓基於註解的RabbitMQ模式
- 在啓動類加上@EnableRabbit,開啓基於註解的RabbitMQ模式
/**
* sweet-dream啓動類
*
* @author ZHANGCHAO
*/
@Slf4j
@EnableRabbit
@EnableTransactionManagement
@SpringBootApplication
@MapperScan({"com.junya.dao","com.junya.mapper"})
public class DreamApplication {
public static void main(String[] args) {
SpringApplication.run(DreamApplication.class, args);
}
}
- 注入AmqpAdmin,rabbitMq的管理組件
@Autowired
private AmqpAdmin amqpAdmin;
AmqpAdmin有很多方法,比如創建和移除交換機、隊列、綁定等,下面簡單列舉幾個
/**
* 創建交換器
*
* @Author ZHANGCHAO
* @Date 2020/3/5 9:32
* @param
* @retrun void
**/
@GetMapping("/creatExchange")
public void creatExchange() {
amqpAdmin.declareExchange(new DirectExchange("amqpadmin.exchange"));
}
/**
* 創建隊列
*
* @Author ZHANGCHAO
* @Date 2020/3/5 9:32
* @param
* @retrun void
**/
@GetMapping("/creatQueue")
public void creatQueue() {
amqpAdmin.declareQueue(new Queue("amqpadmin.queue",true));
}
/**
* 創建綁定關係
*
* @Author ZHANGCHAO
* @Date 2020/3/5 9:33
* @param
* @retrun void
**/
@GetMapping("/creatBinding")
public void creatBinding() {
amqpAdmin.declareBinding(new Binding("amqpadmin.queue",Binding.DestinationType.QUEUE,
"amqpadmin.exchange","amqp.哈哈",null));
}
- 新建RabbitMqService類,加幾個監聽方法
/**
* rabbitMq相關
*
* @author ZHANGCHAO
* @date 2020/3/5 8:34
* @since 1.0.0
*/
@Service
public class RabbitMqService {
@RabbitListener(queues = {"atguigu.news"})
public void getMsg(GyUser user){
System.out.println("接收到消息:"+user);
}
@RabbitListener(queues = {"atguigu.emps"})
public void getMsg1(Message message) {
System.out.println(message);
System.out.println(message.getBody());
System.out.println(message.getMessageProperties());
}
}
@RabbitListener(queues = {“atguigu.emps”}) 監聽指定的隊列,內部接收數組,可以監聽多個隊列。如果其中隊列接收到消息會執行方法,打印消息。
總結
自動配置
-
1、RabbitAutoConfiguration
-
2、有自動配置了連接工廠ConnectionFactory;
-
3、RabbitProperties 封裝了 RabbitMQ的配置
-
4、 RabbitTemplate :給RabbitMQ發送和接受消息;
-
5、 AmqpAdmin : RabbitMQ系統管理功能組件;
AmqpAdmin:創建和刪除 Queue,Exchange,Binding
-
6、@EnableRabbit + @RabbitListener 監聽消息隊列的內容