मेरे पास Azure सेवा बस कोड के आस-पास एक मूल आवरण है जो हम एक कार्यकर्ता भूमिका के भीतर उपयोग करेंगे। जब भी कार्यकर्ता की भूमिका चलती है तो यह 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
आरंभ निर्माता के अंदर देख सकते हैं: वे तो पुन: उपयोग कर रहे हैं जब SendMessage()
और ReceiveTopMessage()
कनेक्शन एक Dispose()
विधि का उपयोग कर बंद के साथ बुला।
मेरा सवाल यह है कि मैं जिस दृष्टिकोण का उपयोग कर रहा हूं वह है सुरक्षित; QueueClient
का एक उदाहरण तब तक खुला होगा जब एक कार्यकर्ता भूमिका कतार पर सभी संदेशों के माध्यम से गिनती करेगी (एक प्रक्रिया जो ReceiveTopMessage()
पर कॉल के बीच लंबे इंतजार के साथ कनेक्शन को थोड़ी देर के लिए खोल सकती है) लगातार क्षणिक मुद्दों के बिना काम करती है, या क्या यह हर बार कनेक्शन खोलने और बंद करने के लिए समझदार है?
एक तरफ के रूप में; माइक्रोसॉफ्ट सर्विस बस कोड में क्षणिक गलती हैंडलिंग कैसे आयोजित की जाती है? क्या यह डिफ़ॉल्ट रूप से आयोजित किया जाता है या क्या हमें Transient Fault Handling Framework को लागू करने की आवश्यकता है?
उत्कृष्ट लिंक आपको धन्यवाद; मैं अपने रैपर में [विश्वसनीय संदेश प्राप्त लूप लागू) [http://msdn.microsoft.com/en-us/library/windowsazure/hh851750.aspx) का उपयोग करूँगा। यदि 'QueueClient' क्लास कनेक्शन नहीं खोलता है; क्या यह स्वचालित रूप से संभाला जाता है जब 'रीसीविव()' जैसी विधि कहा जाता है? –
मैंने अनुशंसित उपयोग पैटर्न के बारे में अतिरिक्त दस्तावेज के साथ अपना उत्तर स्पष्ट किया है और कौन सा ऑब्जेक्ट टीसीपी कनेक्शन को संभालता है। –
मेरा प्रश्न इस प्रश्न से संबंधित है यदि आप एक नज़र देख सकते हैं: http://stackoverflow.com/questions/33512803/service-bus-singleton-connection-class @FernandoCorreia – Ron