簡體   English   中英

服務總線如何在服務器重啟后重新連接(非天藍色)

[英]Service Bus how to reconnect after servers restart (non-azure)

我在Premise上使用Service Bus 1.1,我正在構建一個WindowsService,它應該只是在另一台機器上運行的特定隊列上偵聽。

連接到SB的WindowsService代碼如下:

MessagingFactory _receiverFactory = MessagingFactory.CreateFromConnectionString(sbConnectionString);
MessageReceiver _messageReceiver = _receiverFactory.CreateMessageReceiver(listeningQueue);

BrokeredMessage brokeredMessage = _messageReceiver.Receive(TimeSpan.FromSeconds(60));

一切正常,直到我重新啟動服務器:我注意到如果WindowsService在服務總線的所有服務都可用之前啟動,我的應用程序將永遠不會連接,直到我手動重啟我的WindowsService。

實際上,如果在構建MessagingFactory時SB沒有完全運行,則接收指令將始終失敗,即使SB服務第二次返回...

我試圖攔截異常(MessagingCommunicationException)並重建MessagingFactory,但根本不起作用,重新連接的唯一方法是重啟WindowsService。

有什么建議么?

  1. 設置高可用性(“HA”)服務場。

https://blogs.technet.microsoft.com/meamcs/2013/12/08/recommended-practices-service-bus-for-windows-server/

http://www.planetgeek.ch/2014/12/10/service-bus-for-windows-server-high-availability/

但即使你做或不做#1“HA”,你應該做#2。

  1. 使用“ Polly ”捕獲並自動重試SPECIFIC異常

     using System; using System.Collections.Generic; using System.Linq; using System.Threading; using Microsoft.ServiceBus; using Microsoft.ServiceBus.Messaging; using Polly; private static void KeepReadingTheQueue(QueueClient qc) { int retries = 0; int eventualFailures = 0; Policy pol = Policy.Handle<System.OperationCanceledException>(ex => null != ex) .Or<UnauthorizedAccessException>(ex => null != ex) .Or<Microsoft.ServiceBus.Messaging.MessagingCommunicationException>() .Or<Microsoft.ServiceBus.Messaging.MessageLockLostException>() .WaitAndRetryForever( sleepDurationProvider: attempt => TimeSpan.FromMilliseconds(500), // Wait 500ms between each try. onRetry: (exception, calculatedWaitDuration, context) => // Capture some info for logging! { ReportDuplicatesOrMissing("Policy.OnRetry", batchNumbers); // This is your new exception handler! // Tell the user what they've won! Console.WriteLine("Log, then retry: " + exception.Message, ConsoleColor.Yellow); retries++; }); int i = 0; int receiveBatchSize = 1; /* i have this in a custom settings class, hard coded here */ while (true) { i++; ReportDuplicatesOrMissing("while.true", batchNumbers); try { // Retry the following call according to the policy - 15 times. pol.Execute(() => { IEnumerable<BrokeredMessage> messages = null; if (receiveBatchSize <= 1) { // Receive the message from the queue BrokeredMessage receivedMessage = qc.Receive(); List<BrokeredMessage> listMsgs = new List<BrokeredMessage>(); listMsgs.Add(receivedMessage); messages = listMsgs as IEnumerable<BrokeredMessage>; } else { messages = qc.ReceiveBatch(receiveBatchSize); int count = messages.Count(); if (count > 0) { Console.WriteLine("ReceiveBatch.Count='{0}'", count); } } foreach (BrokeredMessage receivedMessage in messages) { if (receivedMessage != null) { MyPayLoadObject concreteMsgObject = receivedMessage.GetBody<MyPayLoadObject>(); receivedMessage.Complete(); Console.WriteLine(@"Message received: {0}", concreteMsgObject); } else { Console.WriteLine(@"No new messages in the queue"); Thread.Sleep(1000); } Thread.Sleep(100); } }); } catch (Exception e) { Console.WriteLine("Request " + i + " eventually failed with: " + e.Message, ConsoleColor.Red); eventualFailures++; } } } 

packages.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.WindowsAzure.ConfigurationManager" version="2.0.1.0" targetFramework="net45" />
  <package id="Polly" version="4.3.0" targetFramework="net45" />
  <package id="WindowsAzure.ServiceBus" version="2.1.4.0" targetFramework="net45" />
</packages>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM