1. Spring Boot整合RabbitMQ
1.1. 簡(jiǎn)介
在Spring項(xiàng)目中火架,可以使用Spring-Rabbit去操作RabbitMQ https://github.com/spring-projects/spring-amqp
尤其是在spring boot項(xiàng)目中只需要引入對(duì)應(yīng)的amqp啟動(dòng)器依賴即可馆匿,方便的使用RabbitTemplate發(fā)
送消息竭钝,使用注解接收消息梨撞。
一般在開發(fā)過程中:
生產(chǎn)者工程:
- application.yml文件配置RabbitMQ相關(guān)信息雹洗;
- 在生產(chǎn)者工程中編寫配置類,用于創(chuàng)建交換機(jī)和隊(duì)列卧波,并進(jìn)行綁定
- 注入RabbitTemplate對(duì)象时肿,通過RabbitTemplate對(duì)象發(fā)送消息到交換機(jī)
消費(fèi)者工程:
- application.yml文件配置RabbitMQ相關(guān)信息
- 創(chuàng)建消息處理類,用于接收隊(duì)列中的消息并進(jìn)行處理
1.2. 搭建生產(chǎn)者工程
1.2.1. 創(chuàng)建工程
創(chuàng)建生產(chǎn)者工程springboot-rabbitmq-producer
1.2.2. 添加依賴
修改pom.xml文件內(nèi)容為如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<groupId>com.itheima</groupId>
<artifactId>springboot-rabbitmq-producer</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
</project>
1.2.3. 啟動(dòng)類
package com.itheima.rabbitmq;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication public class ProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ProducerApplication.class);
}
}
1.2.4. 配置RabbitMQ
1)配置文件
創(chuàng)建application.yml港粱,內(nèi)容如下:
spring:
rabbitmq:
host: localhost
port: 5672
virtual-host: /itcast
username: heima
password: heima
2)綁定交換機(jī)和隊(duì)列
創(chuàng)建RabbitMQ隊(duì)列與交換機(jī)綁定的配置類com.itheima.rabbitmq.config.RabbitMQConfig
package com.itheima.rabbitmq.config;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration public class RabbitMQConfig {
//交換機(jī)名稱
public static final String ITEM_TOPIC_EXCHANGE = "item_topic_exchange";
//隊(duì)列名稱
public static final String ITEM_QUEUE = "item_queue";
//聲明交換機(jī)
@Bean("itemTopicExchange")
public Exchange topicExchange(){
return
ExchangeBuilder.topicExchange(ITEM_TOPIC_EXCHANGE).durable(true).build();
}
//聲明隊(duì)列
@Bean("itemQueue")
public Queue itemQueue(){
return QueueBuilder.durable(ITEM_QUEUE).build();
}
//綁定隊(duì)列和交換機(jī)
@Bean
public Binding itemQueueExchange(@Qualifier("itemQueue") Queue queue,
@Qualifier("itemTopicExchange") Exchange
exchange){
return BindingBuilder.bind(queue).to(exchange).with("item.#").noargs();
}
}
1.2.5 消息發(fā)送Controller
我們創(chuàng)建一個(gè)SpringMVC的Controller方便我們進(jìn)行測(cè)試
package com.itheima.rabbitmq.controller;
import com.itheima.rabbitmq.config.RabbitMQConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/***
發(fā)送消息的測(cè)試類
*/
@RestController
public class SendMsgController {
//注入RabbitMQ的模板
@Autowired
private RabbitTemplate rabbitTemplate;
/***
測(cè)試
*/ @GetMapping("/sendmsg")
public String sendMsg(@RequestParam String msg, @RequestParam String key){
/**
* 發(fā)送消息
* 參數(shù)一:交換機(jī)名稱
* 參數(shù)二:路由key
* 參數(shù)三:發(fā)送的消息
*/
rabbitTemplate.convertAndSend(RabbitMQConfig.ITEM_TOPIC_EXCHANGE ,key ,msg);
//返回消息
return "發(fā)送消息成功螃成!";
}
}
1.3. 搭建消費(fèi)者工程
1.3.1. 創(chuàng)建工程
創(chuàng)建消費(fèi)者工程springboot-rabbitmq-consumer
1.3.2. 添加依賴
修改pom.xml文件內(nèi)容為如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version>
</parent>
<groupId>com.itheima</groupId>
<artifactId>springboot-rabbitmq-consumer</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
1.3.3. 啟動(dòng)類
1.3.4. 配置RabbitMQ
創(chuàng)建application.yml,內(nèi)容如下:
spring:
rabbitmq:
host: localhost
port: 5672
virtual-host: /itcast
username: heima
password: heima
1.3.5. 消息監(jiān)聽處理類
編寫消息監(jiān)聽器com.itheima.rabbitmq.listener.MyListener
package com.itheima.rabbitmq.listener;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class MyListener { /*** 監(jiān)聽某個(gè)隊(duì)列的消息 *
@param message
接收到的消息 */
@RabbitListener(queues = "item_queue")
public void myListener1(String message){
System.out.println("消費(fèi)者接收到的消息為:" + message); } }
1.3.6. 測(cè)試
在生產(chǎn)者工程springboot-rabbitmq-producer中創(chuàng)建測(cè)試類查坪,發(fā)送消息:
package com.itheima.rabbitmq;
import com.itheima.rabbitmq.config.RabbitMQConfig;
import org.junit.Test; import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class RabbitMQTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test public void test(){
rabbitTemplate.convertAndSend(RabbitMQConfig.ITEM_TOPIC_EXCHANGE,
"item.insert", "商品新增寸宏,routing key 為item.insert"); rabbitTemplate.convertAndSend(RabbitMQConfig.ITEM_TOPIC_EXCHANGE,
"item.update", "商品修改,routing key 為item.update"); rabbitTemplate.convertAndSend(RabbitMQConfig.ITEM_TOPIC_EXCHANGE,
"item.delete", "商品刪除咪惠,routing key 為item.delete");
}
}
先運(yùn)行上述測(cè)試程序(交換機(jī)和隊(duì)列才能先被聲明和綁定)击吱,然后啟動(dòng)消費(fèi)者;在消費(fèi)者工程
springboot-rabbitmq-consumer中控制臺(tái)查看是否接收到對(duì)應(yīng)消息遥昧。
另外覆醇;也可以在RabbitMQ的管理控制臺(tái)中查看到交換機(jī)與隊(duì)列的綁定: