RabbitMQ學習系列三:.net 環境下 C#代碼訂閱 RabbitMQ 消息並處理
http://www.80iter.com/blog/1438251320680361
http://www.80iter.com/blog/1414401059921214
上一篇已經講了Rabbitmq如何在Windows平台安裝
不懂請移步: RabbitMQ學習系列二:.net 環境下 C#代碼使用 RabbitMQ 消息隊列
一、理論
.net環境下,C#代碼訂閱RabbitMQ消息隊列,本文用easynetq開源的.net Rabbitmq api來實現,EasyNetQ 是一個易於使用的RabbitMQ的.Net客戶端API,本文win服務基於topshelf實現,不懂請移步:windowsSevice程序和topshelf程序創建服務對比
區別主要在於以下幾點:
1、編寫方式
一個是windowservice
一個是console控制台程序
2、安裝方式
windowservice 需要自帶的framework中的installutil
topshelf打包的控制台程序自己隨意安裝
3、部署
理論不通過其他手段一個windowservice部署文件夾包只能部署一個服務,想部署多套相同服務,需要拷貝多個相同文件夾進行多次安裝
topshelf則可以多個服務指向一個文件夾
4、調試
windowservice調試,不解釋多麻煩
console控制台程序調試簡單方便
安裝:%systemroot%\microsoft.net\framework\v2.0.50727\installUtil.exe D:\Debug\WindowsService1.exe
卸載:sc delete服務名
net start 服務名
net stop 服務名
sc start 服務名
sc stop 服務名
部署windows服務--制作安裝包
1、建立一個新的windows服務項目Server1
2、打開Service1代碼視圖,找到OnStart部分,加入代碼
3、切換到設計視圖,右鍵-添加安裝程序
4、切換到新生成的ProjectInstaller.cs設計視圖,找到serviceProcessInstaller1對Account屬性設置為LocalSystem,對serviceInstaller1的ServiceName屬性設置為Server1(服務的名字),StartType屬性設置為Automatic(系統啟動的時候自動啟動服務)
1、 Topshelf下載地址https://github.com/Topshelf/Topshelf/downloads
2、 官網http://topshelf-project.com/
3、 文檔http://docs.topshelf-project.com/en/latest/
4、 install: ConsoleApplication1.exe install
5、 start: ConsoleApplication1.exe start ,執行后服務被啟動
6、 stop: ConsoleApplication1.exe stop ,執行后服務被停止
7、 uninstall: ConsoleApplication1.exe uninstall,執行后服務被卸載
8、 很方便的安裝卸載服務,同時我們本地調試也很簡單,直接運行控制台即可
9、 下面我們再嘗試一個方法,使用同一個ConsoleApplication1.exe創建若干個服務
10、 參數-instance執行安裝 ConsoleApplication1.exe -instance " test1" install
11、同理再創建一個實例 ConsoleApplication1.exe -instance " test2" install
你會發現你的系統服務里增加了兩個相同服務的不同實例 ,若要卸載直接將安裝時的命令install 換位uninstall即可卸載
二、項目搭建
1、此處省略topshelf服務搭建步驟
2、服務項目結構
3、結構簡要說明
NoticeProcess.cs 獲取消息體后處理類
BusBuilder.cs 消息服務器連接器
Installer.cs 消息服務安裝實現類
ServiceMain.cs 消息服務執行類
VaultService.cs C#訂閱消息服務后的處理類,進行routingkey的約束等
Program.cs 程序啟動類
三、測試發布和訂閱
1、發布消息(此處省略,具體實現參照第二篇文章)
2、C#訂閱服務啟動測試
3、C#服務調試獲取消息
可以看到這里啟動后,獲取到了1步驟當中的消息routingkey
4、c#處理代碼
如果隊列有其他的pcm.notice.xxxxx消息,同樣會被c#服務獲取到,都是基於pcm.notice.#這樣的#完全匹配原則。
這樣基本簡單的c#訂閱Rabbitmq消息,獲取信息就完成了。
問題整理:
如果C#讀取的Rabbitmq中message消息實體和你c#程序中的不一樣,會報錯如下:
EasyNetQ.EasyNetQInvalidMessageTypeExcepion:Message type is incorrect.Expected 'RabbitMQ_Message:RabbitMQ',but was ''