2015-07-03 75 views
3

我創建了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(); 
... 

回答

3

您需要多個虛擬主機在RabbitMQ服務器中分離您的ServiceStack應用程序。

相反的amqp://localhost:5672你可以配置你的RabbitMqServer這裏描述的時候使用amqp://localhost:5672/vhostnamehttps://github.com/ServiceStack/ServiceStack/wiki/Rabbit-MQ

在實際部署中的RabbitMQ服務器不會在本地主機上。我使用上面的內容作爲從當前使用內置默認值amqp://localhost:5672調用new RabbitMqServer()的地方開始的一小步。

需要在RabbitMQ服務器上提前添加虛擬主機,並且需要分別爲其創建用戶。它們實際上是具有共享基礎架構的獨立AMQP服務器。

可以按如下

rabbitmqctl add-vhost vhostname 
+0

我會記住這爲答案,因爲這是隔離不同的應用程序的正確方法與rabbitmqctl添加虛擬主機。我還用更新部分編輯了我的問題,其中解釋了我如何修復/防止發生的異常。 –

相關問題