我創建了2個ServiceStack應用程序,它們通過TopShelf作爲Windows服務運行,並使用一臺RabbitMQ服務器。不幸的是,當我開始第二個應用程序會出現以下異常:帶一臺RabbitMQ服務器的多個ServiceStack應用程序
異常兔MQ服務器:AMQP操作被中斷:AMQP近距離原因,通過同伴,代碼= 406,文本=「PRECONDITION_FAILED啓動 - 不能重新聲明交換 'mx.servicestack.topic' 在虛擬主機 '/' 具有不同的類型,耐用,內部或自動刪除值」
啓動代碼包含以下代碼:
應用1
...
var rabbitMqServer = new RabbitMqServer();
rabbitMqServer.RegisterHandler<BusMessages.CrawlRequest>(
n =>
{
var request = n.GetBody();
this.Crawl(request);
return null;
});
rabbitMqServer.Start();
...
應用2
...
var rabbitMqServer = new RabbitMqServer();
rabbitMqServer.RegisterHandler<SendMailRequest>(
message =>
{
SendMail(message.GetBody());
return null;
});
rabbitMqServer.Start();
...
這個問題似乎是與名爲mx.servicestack.topic
交流,這是由ServiceStack默認。有誰知道一個解決方案來繞過這個或更改Exchange名稱,以便我可以將多個(而不是默認的)ServiceStack應用程序與相同的RabbitMQ服務器結合使用嗎?
更新
當我正在尋找到它更深刻地這似乎是在ServiceStack.RabbitMq v4.0.31(在應用1中使用)的錯誤。在該版本中,默認交易所mx.servicestack.topic
被添加爲fanout
交換類型,而不是topic
交換類型。應用2正在使用ServiceStack.RabbitMq v4.0.40,它試圖添加/使用交換mx.servicestack.topic
作爲topic
交換類型,因爲它應該是。將ServiceStack軟件包升級到App 1版本4.0.40解決了此問題。
我更喜歡不同的應用隔離的方式,如阿蘭在他的回答https://stackoverflow.com/a/31209330/1278669解釋。
但是,對於在相同(小)客戶域中工作的不同應用程序,使用ServiceStack創建的默認交換機是非常可行的。
最後但並非最不重要的,我發現了一個骯髒的解決方法,以獲取應用2下一個運行到App 1而不升級這是通過以下操作完成的應用程序1的ServiceStack包:
...
QueueNames.ExchangeTopic = "mx.App2.topic";
var rabbitMqServer = new RabbitMqServer();
...
我會記住這爲答案,因爲這是隔離不同的應用程序的正確方法與rabbitmqctl添加虛擬主機。我還用更新部分編輯了我的問題,其中解釋了我如何修復/防止發生的異常。 –