ワーカー ロール内で使用する Azure Service Bus コードの基本的なラッパーを以下に示します。これServiceBusClient
は、worker ロールが実行されるたびにインスタンス化されます。その後、列挙するアイテムがなくなるまで、キューにアクセスするために使用されます。
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
再利用され、メソッドを使用して接続が閉じられます。SendMessage()
ReceiveTopMessage()
Dispose()
私の質問は、私が使用しているアプローチが安全かどうかです。worker ロールがキュー上のすべてのメッセージを列挙している間、の 1 つのインスタンスをQueueClient
開いたままにします ( への呼び出し間の長い待機でかなり長い間接続を開いたままにしておくことができるプロセスReceiveTopMessage()
) は、一時的な問題なしで一貫して動作しますか?毎回接続を開いたり閉じたりするのは賢明ですか?
余談として; Microsoft Service Bus コードで行われる一時的な障害処理はどのように行われますか? デフォルトで実施されますか、それとも一時的な障害処理フレームワークを実装する必要がありますか?