RabbitMQ是目前非常熱門的一款訊息中介軟體,不管是網際網路大廠還是中小企業都在大量使用。Spring Boot的興起,極大地簡化了Spring的開發,本文將使用Spring Boot與RabbitMQ進行簡單整合,實現生產和消費訊息。
配置
Spring Boot使用了這麼久,套路差不多摸清楚了。Spring Boot與其他元件進行整合,無非就是加入pom依賴,接著配置一些基本資訊,然後就可以使用相關注解進行開發了。
RabbitMQ也是相同的套路,第一步要引入依賴。要引入的依賴比較容易記,RabbitMQ實現了AMQP協議,引入依賴spring-boot-starter-amqp
。
<!-- rabbitmq依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
第二步要配置RabbitMQ連線資訊,包括主機、埠號、使用者名稱和密碼。RabbitMQ配置資訊:
spring.rabbitmq.host=192.168.16.128
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
如果沒有安裝RabbitMQ,我推薦使用Docker快速安裝和啟動,啟動命令:
docker run -d --hostname my-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3.8.0-beta.4-management
實現生產者和消費者
第三步實現生產和消費者。
生產者
生產者用來生產訊息並進行傳送。需要用到RabbitTemplate
。RabbitTemplate
是傳送訊息的關鍵類,convertAndSend
方法可以指定訊息傳送的交換器、路由鍵、訊息內容等。
@Component
public class Producer {
@Autowired
RabbitTemplate rabbitTemplate;
public void produce() {
String message = new Date() + "Beijing";
System.out.println("生產者生產訊息=====" + message);
rabbitTemplate.convertAndSend("rabbitmq_queue", message);
}
}
消費者
消費者消費生產者傳送的訊息。實現消費者主要用到註解@RabbitListener
。@RabbitListener
是一個功能強大的註解。這個註解裡面可以註解配置@QueueBinding、@Queue、@Exchange直接通過這個組合註解一次性搞定多個交換機、繫結、路由、並且配置監聽功能等。
- 在RabbitMQ控制皮膚建立好佇列,使用@RabbitListener監聽佇列。
@RabbitListener(queues = "rabbitmq_queue")
- 使用@RabbitListener自動建立佇列。
@RabbitListener(queuesToDeclare = @Queue("myQueue"))
- 使用@RabbitListener自動建立佇列,並對Exchange和Queue進行繫結。
@RabbitListener(bindings = @QueueBinding(value = @Queue("myQueue"), key = "mobi", exchange = @Exchange("myExchange")))
本文使用@RabbitListener自動建立一個佇列。
@Component
public class Consumer {
@RabbitHandler
@RabbitListener(queuesToDeclare = @Queue("rabbitmq_queue"))
public void process(String message) {
System.out.println("消費者消費訊息=====" + message);
}
}
測試
第四步測試。為了方便,寫一個測試類生產訊息。然後啟動工程,執行測試類,使生產者傳送訊息,不出意外消費者將會消費訊息,在控制檯輸出資訊。
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Autowired
Producer producer;
@Test
public void contextLoads() {
producer.produce();
}
}
操作之後可以在測試控制檯看到生產者訊息傳送成功,在該工程的控制檯看到訊息消費成功。
訪問RabbitMQ控制皮膚也會看到有訊息。
總結
Spring Boot極大的簡化各種元件的使用,在實際應用中,當一個服務處理完成之後可以將訊息放進RabbitMQ訊息佇列,另外一個服務從佇列中取訊息進行消費,這樣可以降低服務之間的耦合,實現一些非同步的操作。本文僅作為一個簡單demo供參考。