RabbitMQ是一個消息中間件,負責項目間消息的傳遞。使用消息中間件可以做到項目間解耦和消息的異步處理。支持多語言開發(fā)。
RabbitMQ原理:
首先是在RabbitMQ創(chuàng)建所需的exchange中轉(zhuǎn)站和queue隊列。創(chuàng)建exchange和queue可以通過服務器代碼實現(xiàn),也可以通過RabbitMQ提供的web管理界面或者http api來操作。
消息生產(chǎn)者服務器將消息發(fā)送到指定的exchange中轉(zhuǎn)站,中轉(zhuǎn)站接收到路由指定,將消息放入exchange通過routekey綁定的queue隊列,等待消息被消費。
消息消費者服務器連接到RabbitMQ,通過對指定queue隊列的監(jiān)聽來獲取消息。
同時RabbitMQ做了消息確認和消息持久化的方案來確保消息是否被消費和crash之后的消息的恢復。
RabbitMQ提供了豐富的http api接口供調(diào)用來監(jiān)控RabbitMQ的運行情況。
spring boot集成RabbitMQ使用:
引入jar包
pom.xml中增加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
配置
在啟動類中增加:
@Bean(name = "demoQueue")
public Queue getQueue(){
return new Queue("queueName");
}
@Bean(name = "demoExchange")
TopicExchange exchange() {
return new TopicExchange("exchangeName");
}
@Bean
Binding binding(Queue demoQueue, TopicExchange demoExchange) {
return BindingBuilder.bind(demoQueue).to(demoExchange).with("routingKey");
}
上面這段代碼的意思是:創(chuàng)建一個名為queueName的queue和名為exchangeName的exchange,然后通過名為routingKey的路由鍵將該queue綁定到exchange上。
這一步創(chuàng)建exchange和queue及綁定應該是在消息生成者中。之后才是發(fā)送消息。
消息是不會發(fā)送到一個不存在的queue上的。
簡單的消息發(fā)送
@Component
public class MessageSender{
@Autowired
private RabbitTemplate rabbitTemplate;
//發(fā)送一個字符串
public void send(String msg) {
this.rabbitTemplate.convertAndSend("exchangeName","routingKey", msg);
}
//發(fā)送一個可序列化對象
public void send(Job job) {
this.rabbitTemplate.convertAndSend("exchangeName","routingKey", job);
}
}
convertAndSend()方法提供了很多重載實現(xiàn)。傳遞的消息類型是object。
另外如果傳遞對象的話,該對象必須繼承了Serializable接口。同時,消息接收者必須有同樣的對象類來接收該消息,而且該對象類所處的包路徑必須一致才行。
消息發(fā)送可以繼承RabbitTemplate.ConfirmCallback接口來實現(xiàn)消息發(fā)送確認機制。
接收消息
@Component
@RabbitListener(queues = "queueName")
public class RabbitMqReciever {
@RabbitHandler
public void process(String hello) {
System.out.println("Receiver : " + hello);
}
@RabbitHandler
public void process(Job job) {
System.out.println("Receiver : " + job);
}
}
注解@RabbitListener()是指定接收消息的名為queueName的queue
如果有消息就根據(jù)消息類型的不同來調(diào)用不同的方法。
OVER!