ABP vNext EventBus For RabbitMQ 分散式事件匯流排使用注意事項_補充官網文件
阿新 • • 發佈:2021-01-09
![](https://img2020.cnblogs.com/blog/2193154/202101/2193154-20210109141150930-150842908.png)
[https://docs.abp.io/zh-Hans/abp/latest/Distributed-Event-Bus-RabbitMQ-Integration](ABP vNext官方文件連結),基本使用可直接閱讀官方文件,雲懷不重複造輪子,只做官方未提到但重要的說明
## 關鍵配置說明
### 關鍵配置類:AbpRabbitMqEventBusOptions.cs
用於配置連線名、佇列名即要監聽的佇列名、交換機名;
![](https://img2020.cnblogs.com/blog/2193154/202101/2193154-20210109141643271-138894472.png)
### 關鍵配置類:AbpRabbitMqOptions
即原始RabbitMq針對.NET的連線配置類:RabbitMqConnections.cs
![](https://img2020.cnblogs.com/blog/2193154/202101/2193154-20210109141948315-1188499427.png)
## 關鍵配置——appsettings.json
### 本地連線配置
```
"RabbitMQ": {
"EventBus": {
"ClientName": "MyClientName",
"ExchangeName": "MyExchangeName"
}
}
```
### 遠端主機配置
叢集用逗號分隔
```"RabbitMQ": {
"Connections": {
"Default": {
"HostName": "192.168.1.101:5701,ip2:port2,ip3:port3",
"UserName": "yunhuai",
"Password": "yunhuai",
"VirtualHost": "/test"
}
},
"EventBus": {
"ClientName": "MsDemo_AServer",
"ExchangeName": "MsDemo"
}
}
```
### 多主機
若應用程式有多個主機,指定其中之一為EventBus
```
{
"RabbitMQ": {
"Connections": {
"Default": {
"HostName": "123.123.123.123"
},
"SecondConnection": {
"HostName": "321.321.321.321"
}
},
"EventBus": {
"ClientName": "MyClientName",
"ExchangeName": "MyExchangeName",
"ConnectionName": "SecondConnection"
}
}
}
```
## ABP vNext 底層限制
* 交換機只支援direct路由,原RabbitMQ可配置
* 交換機和佇列強行持久化,原RabbitMQ可配置
* 當所有繫結佇列都不在了,交換機也強制可不自動刪除,原RabbitMQ可配置
* 強制不可申明排他性佇列,排他性佇列特徵:只對首次申明佇列的連線可見並會在該連線斷開時自動刪除,原RabbitMQ可配置
* 當所有消費者斷開後,強制不會刪除該佇列,原RabbitMQ可配置
備註:以上皆因原始碼寫死,並非RabbitMQ不支援,原始碼如下:
![](https://img2020.cnblogs.com/blog/2193154/202101/2193154-20210109143026989-1432636251.png)
## 注意事項
![](https://img2020.cnblogs.com/blog/2193154/202101/2193154-20210109143103391-1918855474.png)
* A服務=》B服務=》C服務,傳輸物件1與傳輸物件2不能是同一個名稱空間下的同一個類名,這是由於ABP vNext EventBus底層將完整類名作為路由鍵進行轉發,如果兩個物件一致,那麼B將進入死迴圈,附帶C也進入異常
* A、B、C之間應該共用同一個交換機,即配置的ExChangeName一致,而佇列名不一致
* 不存在自己指定自己作為生產者的佇列的名字,所以必須先啟動佇列消費者建立了相關佇列,佇列生產者發出Message才有效果,即啟動順序:C=>B=>A