Wiederverwenden von Verbindungen in Azure Service Bus
Wir haben eine auf Windows Azure gehostete API in einer Webrolle mit 2 Instanzen, die Anforderungen entgegennimmt, validiert und anschließend einer Azure Service Bus-Warteschlange hinzufügt.
Kürzlich haben wir begonnen, dies zu testen und festgestellt, dass unser aktueller Code die folgende Ausnahme auslöst:
Befehl konnte nicht zur Befehlswarteschlange hinzugefügt werden Ausnahme: Microsoft.ServiceBus.Messaging.QuotaExceededException: Die Anzahl der maximal zulässigen Verbindungen wurde für die Warteschlange erreicht oder überschritten. Anzahl der aktiven Verbindungen: 100, Maximal zulässige Verbindungen: 100.
Würde der folgende Client-Code eine einzelne Verbindung offen halten, vorausgesetzt, wir hätten eine einzelne Instanz der Klasse beibehalten? Ich versuche festzustellen, ob es sich um ein Problem mit dem ServiceBusClient-Code oder unserer Abhängigkeitsregistrierung handelt, mit der für jede Anforderung ein neuer Client initialisiert wird.
public class ServiceBusClient : IDisposable
{
#region Constants and Fields
protected readonly NamespaceManager NamespaceManager;
private const int DEFAULT_LOCK_DURATION_IN_SECONDS = 300; // 5 minutes
private const string SERVICE_BUS_CONNECTION_STRING_KEY
= "service.bus.connection.string";
private readonly IMessageBodySerializer _messageBodySerializer;
private readonly MessagingFactory _messagingFactory;
private readonly QueueClient _queueClient;
private readonly string _queueName;
private readonly ISettingsManager _settingsManager;
#endregion
#region Constructors and Destructors
public ServiceBusClient(
ISettingsManager settingsManager,
IMessageBodySerializer messageBodySerializer, s
tring queueName)
{
_settingsManager = settingsManager;
_messageBodySerializer = messageBodySerializer;
var connectionString = _settingsManager.GetSetting<string>(
SERVICE_BUS_CONNECTION_STRING_KEY);
NamespaceManager =
NamespaceManager.CreateFromConnectionString(connectionString);
_messagingFactory =
MessagingFactory.CreateFromConnectionString(connectionString);
_queueName = queueName;
_queueClient = GetOrCreateQueue();
}
#endregion
#region Public Methods and Operators
public virtual void SendMessage(object bodyObject)
{
var brokeredMessage =
_messageBodySerializer.SerializeMessageBody(bodyObject);
_queueClient.Send(brokeredMessage);
}
public void Dispose()
{
_messagingFactory.Close();
}
#endregion
#region Methods
private QueueClient GetOrCreateQueue()
{
QueueDescription queue;
if (!NamespaceManager.QueueExists(_queueName))
{
var queueToCreate = new QueueDescription(_queueName)
{
LockDuration = TimeSpan.FromSeconds(
DEFAULT_LOCK_DURATION_IN_SECONDS)
};
queue = NamespaceManager.CreateQueue(queueToCreate);
}
else
{
queue = NamespaceManager.GetQueue(_queueName);
}
return _messagingFactory.CreateQueueClient(
queue.Path,
ReceiveMode.PeekLock);
}
#endregion
}
Als Erweiterung dazu; wenn der obige Code eine aktive Verbindung offen hält; Wäre die Verwendung des Singleton-Musters zum Speichern einer Instanz des ServiceBusClient für jede Instanz der API gefährlich? Oder verarbeitet das Azure SDK geschlossene Verbindungen intern?