Spring Boot整合RabbitMQ開(kāi)發(fā)實(shí)戰(zhàn)詳解
這篇文章主要講基本的整合。先把代碼跑起來(lái),再說(shuō)什么高級(jí)特性。
RabbitMQ 中的一些術(shù)語(yǔ)
如果你打開(kāi) RabbitMQ web 控制臺(tái),你會(huì)發(fā)現(xiàn)其中有一個(gè) Exhanges 不好理解。下面簡(jiǎn)單說(shuō)明一下。

交換器(Exchange)
交換器就像路由器,我們先是把消息發(fā)到交換器,然后交換器再根據(jù)路由鍵(routingKey)把消息投遞到對(duì)應(yīng)的隊(duì)列。(明白這個(gè)概念很重要,后面的代碼里面充分體現(xiàn)了這一點(diǎn))
隊(duì)列(Queue)
隊(duì)列很好理解,就不用解釋了。
綁定(Binding)
交換器怎么知道把這條消息投遞到哪個(gè)隊(duì)列呢?這就需要用到綁定了。大概就是:使用某個(gè)路由鍵(routingKey)把某個(gè)隊(duì)列(Queue)綁定到某個(gè)交換器(Exchange),這樣交換器就知道根據(jù)路由鍵把這條消息投遞到哪個(gè)隊(duì)列了。(后面的代碼里面充分體現(xiàn)了這一點(diǎn))
加入 RabbitMQ maven 依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>
再加入另外一個(gè)依賴(這個(gè)依賴可省略,主要是用來(lái)簡(jiǎn)化代碼)
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>4.0.2</version> </dependency>
RabbitMQConfig.java 配置
@Configuration
public class RabbitMQConfig {
public final static String QUEUE_NAME = "spring-boot-queue";
public final static String EXCHANGE_NAME = "spring-boot-exchange";
public final static String ROUTING_KEY = "spring-boot-key";
// 創(chuàng)建隊(duì)列
@Bean
public Queue queue() {
return new Queue(QUEUE_NAME);
}
// 創(chuàng)建一個(gè) topic 類型的交換器
@Bean
public TopicExchange exchange() {
return new TopicExchange(EXCHANGE_NAME);
}
// 使用路由鍵(routingKey)把隊(duì)列(Queue)綁定到交換器(Exchange)
@Bean
public Binding binding(Queue queue, TopicExchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);
}
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory("127.0.0.1", 5672);
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
return connectionFactory;
}
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
return new RabbitTemplate(connectionFactory);
}
}
生產(chǎn)者
直接調(diào)用 rabbitTemplate 的 convertAndSend 方法就可以了。從下面的代碼里也可以看出,我們不是把消息直接發(fā)送到隊(duì)列里面的,而是先發(fā)送到了交換器,交換器再根據(jù)路由鍵把我們的消息投遞到對(duì)應(yīng)的隊(duì)列。
@RestController
public class ProducerController {
@Autowired
private RabbitTemplate rabbitTemplate;
@GetMapping("/sendMessage")
public Object sendMessage() {
new Thread(() -> {
for (int i = 0; i < 100; i++) {
String value = new DateTime().toString("yyyy-MM-dd HH:mm:ss");
Console.log("send message {}", value);
rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, RabbitMQConfig.ROUTING_KEY, value);
}
}).start();
return "ok";
}
}
消費(fèi)者
消費(fèi)者也很簡(jiǎn)單,只需要對(duì)應(yīng)的方法上加入 @RabbitListener 注解,指定需要監(jiān)聽(tīng)的隊(duì)列名稱即可。
@Component
public class Consumer {
@RabbitListener(queues = RabbitMQConfig.QUEUE_NAME)
public void consumeMessage(String message) {
Console.log("consume message {}", message);
}
}
運(yùn)行項(xiàng)目
運(yùn)行項(xiàng)目,然后打開(kāi)瀏覽器,輸入 http://localhost:9999/sendMessage 。在控制臺(tái)就可以看到生產(chǎn)者在不停的的發(fā)送消息,消費(fèi)者不斷的在消費(fèi)消息。

打開(kāi) RabbitMQ web 控制臺(tái),也可以看到剛才我們?cè)诖a里面配置的交換器和隊(duì)列,以及綁定信息。

點(diǎn)擊進(jìn)入交換器的詳情


結(jié)語(yǔ)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Spring Boot整合RabbitMQ實(shí)例(Topic模式)
- spring boot整合RabbitMQ實(shí)例詳解(Fanout模式)
- springboot整合rabbitmq的示例代碼
- spring boot整合RabbitMQ(Direct模式)
- SpringBoot整合RabbitMQ 手動(dòng)應(yīng)答(簡(jiǎn)單demo)
- Springboot 整合RabbitMq(用心看完這一篇就夠了)
- SpringBoot整合RabbitMQ, 實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者的功能
- springBoot整合rabbitMQ的方法詳解
- SpringBoot整合RabbitMQ消息隊(duì)列的完整步驟
相關(guān)文章
Java 字符串反轉(zhuǎn)實(shí)現(xiàn)代碼
這篇文章主要介紹了 Java 字符串反轉(zhuǎn)實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03
Spring Boot 防止接口惡意刷新和暴力請(qǐng)求的實(shí)現(xiàn)
本文主要介紹了Spring Boot 防止接口惡意刷新和暴力請(qǐng)求的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
Spring boot 實(shí)現(xiàn)單個(gè)或批量文件上傳功能
這篇文章主要介紹了Spring boot 實(shí)現(xiàn)單個(gè)或批量文件上傳功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-08-08
為什么wait和notify必須放在synchronized中使用
這篇文章主要介紹了為什么wait和notify必須放在synchronized中使用,文章圍繞主題的相關(guān)問(wèn)題展開(kāi)詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考以參考一下2022-05-05
Java中ArrayList和LinkedList的區(qū)別
ArrayList和LinkedList在這個(gè)方法上存在一定的性能差異,本文就介紹了Java中ArrayList和LinkedList的區(qū)別,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06

