RabbitMQ學習
參考:https://www.jianshu.com/p/6b62a0ed2491
消息隊列:目前流行的有 Kafka、RabbitMQ、ActiveMQ等
功能:為了解決消息的分布式消費,完成項目、服務之間的解耦動作。消息的生產者與消費者之間完全采用異步通信方式,極大的提高了系統的響應能力,從而提高系統的網絡請求吞吐量。
Spring-Boot 整合RabbitMQ
依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
RabbitMQ:跨平台的分布式消息隊列服務,可以部署在任意的操作系統上。需要Erlang環境的支持,需要安裝Erlang 和 RabbitMQ
RabbitMQ中有三種常用的轉發方式:
1.DirectExchange:路由鍵方式轉發消息
2.FanoutExchange:廣播方式轉發消息
3.TopicExchange: 主題匹配方式轉發消息
DirectExchange:消息被生產者發送至RabbitMQ會攜帶一個路由鍵Key,RabbitMQ會將該消息轉發,只有路由鍵為Key的隊列消費者會完成消息的消費過程。
幾個重要的類:
RabbitTemplate.ConfirmCallback:用來回調消息發送成功后的方法,當一個消息被成功寫入RabbitMQ服務端時,就會自動回調RabbitTemplate.ConfirmCallback接口內的confirm方法完成通知。
兩個配置信息:
隊列的交換信息 ExchangeEnum
@Getter
public enum ExchangeEnum {
USER_REGISTER("user.register.topic.exchange");
private String value;
ExchangeEnum(String value){
this.value = value;
}
}
隊列路由信息 QueueEnum
@Getter
public enum QueueEnum {
/**
* 用戶注冊枚舉
*/
USER_REGISTER("user.register.queue","user.register");
/**
* 隊列名稱
*/
private String name;
/**
* 隊列路由鍵
*/
private String routingKey;
QueueEnum(String name,String routingKey){
this.name = name;
this.routingKey = routingKey;
}
}
用戶注冊消息隊列配置
@Configuration
public class UserRegisterQueueConfiguration {
/**
* 配置路由交換對象實例
*/
@Bean
public DirectExchange userRegisterDirectExchange(){
return new DirectExchange(ExchangeEnum.USER_REGISTER.getValue());
}
/**
* 配置用戶注冊隊列對象實例
* 並設置持久化隊列
*/
@Bean
public Queue userRegisterQueue(){
return new Queue(QueueEnum.USER_REGISTER.getName(),true);
}
/**
* 將用戶注冊隊列綁定到路由交換配置上並設置指定路由鍵進行轉發
*
*/
@Bean
public Binding userRegisterBinding(){
return BindingBuilder
.bind(userRegisterQueue()).to(userRegisterDirectExchange()).with(QueueEnum.USER_REGISTER.getRoutingKey());
}
}
配置交換實例:
DirectExchange實例對象,為交換設置名稱,消息提供者與消息消費者的交換名稱必須一致才可以通訊。
配置隊列實例:
Queue實例對象,為消息隊列設置名稱,生產者與消費者的隊列名稱也必須一致。
綁定隊列實例到交換實例中:
Binding實例對象,將Queue綁定到Exchange上,並通過設置的路由key進行消息轉發。配置了路由key后,只有符合該路由的配置的消息才會被妝發到綁定的交換上的消息隊列。
生產者:
在業務邏輯完成之后,調用消息發送方法,將消息發送至隊列中
消費者:
@Component
@RabbitListener(queues = "user.register.queue")
public class UserRegisterMQ {
@RabbitHandler
public void execute(UserEntity message){
log.error("用戶:"+message.toString()+",注冊成功");
}
}
兩個注解:
@RabbitListener:隊列消息監聽注解,該注解配置監聽queue內的隊列名稱列表。
@RabbitHandler 消息處理方法,該方法的參數需要與生產者發送消息的類型保持一致,否則無法自動調用消費方法,且無法完成消費。
本文臨摹(抄襲)我的偶像 簡書:恆宇少年 Spring-Boot 四十一章。
生產者和消費者是兩個不同的項目,關於RabbitMQ的配置信息一模一樣,兩個項目分別啟動,消息可以成功接收。
問題:我將消費者打包發給同事,同事無法啟動,我們在同一局域網,但是他本地沒有安裝RabbitMQ,該問題后續定位。。。。。。。。。
