以下に、作業者ロール内で使用するAzure Service Busコードの基本ラッパーを示します。このServiceBusClient
は、ワーカーロールが実行されるたびにインスタンス化されます。次に列挙する残りの項目がなくなるまで待ち行列にアクセスするために使用されます。Azureサービスバスクライアント接続の永続性
public class ServiceBusClient : IDisposable, IServiceBusClient
{
private const int DEFAULT_WAIT_TIME_IN_SECONDS = 120;
private const string SERVICE_BUS_CONNECTION_STRING_KEY = "service.bus.connection.string";
private readonly MessagingFactory _messagingFactory;
private readonly NamespaceManager _namespaceManager;
private readonly QueueClient _queueClient;
private readonly ISettingsManager _settingsManager;
public ServiceBusClient(ISettingsManager settingsManager, string queueName)
{
_settingsManager = settingsManager;
var connectionString = _settingsManager.GetSetting<string>(SERVICE_BUS_CONNECTION_STRING_KEY);
_namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
_messagingFactory = MessagingFactory.CreateFromConnectionString(connectionString);
_queueClient = GetOrCreateQueue(queueName);
}
public void Dispose()
{
_messagingFactory.Close();
}
public BrokeredMessage ReceiveTopMessage()
{
return _queueClient.Receive(TimeSpan.FromSeconds(DEFAULT_WAIT_TIME_IN_SECONDS));
}
public void SendMessage(object bodyObject)
{
var message = new BrokeredMessage(bodyObject);
_queueClient.Send(message);
}
private QueueClient GetOrCreateQueue(string queueName)
{
var queue = !_namespaceManager.QueueExists(queueName)
? _namespaceManager.CreateQueue(queueName)
: _namespaceManager.GetQueue(queueName);
return _messagingFactory.CreateQueueClient(queue.Path, ReceiveMode.PeekLock);
}
}
あなたは、私は、コンストラクタ内部NamespaceManager
、MessagingFactory
とQueueClient
を初期化見ることができるように:接続Dispose()
メソッドを使用して閉じてSendMessage()
とReceiveTopMessage()
を呼び出すとき、彼らはその後、再利用されます。
私の質問は、私が使用しているアプローチは安全であるかどうかです。 Workerロールは、キュー上のすべてのメッセージを介して列挙しながら、過渡問題なく一貫して動作、または(ReceiveTopMessage()
への呼び出しの間に長い待ち時間でかなり長い間オープン接続を保つことができるプロセス)オープンQueueClient
の単一のインスタンスを維持します毎回接続を開いたり閉じたりするのは賢明ですか?
脇に; Microsoftサービスバスコードでは、一時的なフォールト処理はどのように行われますか?デフォルトで実行されていますか、またはTransient Fault Handling Frameworkを実装する必要がありますか? QueueClient
class
優れたリンクありがとうございます。私はラッパーで[信頼できるメッセージ受信ループを実装する](http://msdn.microsoft.com/en-us/library/windowsazure/hh851750.aspx)を使用します。 'QueueClient'クラスが接続をオープンしない場合、 '.Receive()'のようなメソッドが呼び出されたときに自動的に処理されますか? –
私は、推奨される使用パターンとTCP接続を扱うオブジェクトについての追加のドキュメントで答えを明確にしました。 –
私の質問は、あなたが一見することができます場合は、この質問には感謝しています:http://stackoverflow.com/questions/33512803/service-bus-singleton-connection-class @フェルナンドコーリア – Ron