topics topic net example c# azure azureservicebus azure-servicebus-queues

c# - topic - Bus de servicio-Clase de conexión Singleton?



service bus azure example (1)

El protocolo subyacente predeterminado utilizado por el Service Bus SDK es el SBMP (Service Bus Messaging Protocol) patentado que funciona sobre una conexión TCP / IP que se cierra al cerrar la fábrica. Si elige usar TransportType = Amqp (en la cadena de conexión) puede cambiar al protocolo AMQP. En ese caso, la fábrica maneja la conexión TCP única al bus y las clases QueueClient, TopicClient (creadas de fábrica) instancian una sesión y un enlace dentro de la conexión TCP anterior. La sesión y el enlace son dos conceptos de AMQP utilizados para multiplexar en la conexión TCP única. Si cierra solo QueueClient y TopicClient, la operación de cierre solo cierra la sesión y el enlace relacionados, pero no la conexión TCP que se cierra cuando cierra el objeto de fábrica. Por supuesto, no sé cómo funciona SBMP internamente porque es un protocolo patentado. Sin embargo, en un desecho puede cerrar fábrica y objetos de cola / tema relacionados. Cuál es tu problema ?

Estoy tratando de descubrir cuál es la mejor práctica para usar Service Bus desde una API web.

He leído que volver a crear objetos como QueueClient, SubscriptionClient y etc. es un enfoque incorrecto, por lo que necesito reutilizar fábricas y clientes.

Los objetos de cliente de Service Bus, como Microsoft.ServiceBus.Messaging.QueueClient o Microsoft.ServiceBus.Messaging.MessageSender, se crean a través de un objeto MessagingFactory, que también proporciona administración interna de las conexiones. No debe cerrar fábricas de mensajería o cola, tema y clientes de suscripción después de enviar un mensaje, y luego volver a crearlos cuando envíe el siguiente mensaje. Al cerrar una fábrica de mensajería, se elimina la conexión al servicio de Bus de servicio y se establece una nueva conexión al volver a crear la fábrica. Establecer una conexión es una operación costosa que se puede evitar mediante la reutilización de los mismos objetos de fábrica y de cliente para múltiples operaciones.

referencia

Necesito implementar una clase especial que mantenga la conexión con el Bus de servicio, estaba pensando en una clase Singleton que tendrá una operación específica (función como EnqueueJobToArchiveQueue(Job job) y el Constructor inicializará QueueClient, MessageFactory y etc. será utilizado por la "función de operación específica".

Mi problema es que necesito cerrar los objetos ( QueueClient.Close() ), ¿cuándo debo cerrar el objeto?

Aquí está mi clase hasta ahora:

public class ServiceBusHelper { private static readonly ServiceBusHelper instance = new ServiceBusHelper(); private static MessagingFactory msgFactory; private static NamespaceManager namespaceManager; private const string jobQueueName = "job"; private const string responseTopicName = "jobResult"; private const string archiveQueueName = "jobArchive"; private static QueueClient archiveQueue; private static QueueClient jobQueue; private static TopicClient responseTopic; private ServiceBusHelper() { } static ServiceBusHelper() { msgFactory = MessagingFactory.CreateFromConnectionString(ConfigurationManager.AppSettings["ServiceBusCS"]); namespaceManager = NamespaceManager.CreateFromConnectionString(ConfigurationManager.AppSettings["ServiceBusCS"]); if (!namespaceManager.QueueExists(jobQueueName)) { namespaceManager.CreateQueue(jobQueueName); } filteringQueue = QueueClient.CreateFromConnectionString(ConfigurationManager.AppSettings["ServiceBusCS"], jobQueueName); if (!namespaceManager.QueueExists(archiveQueueName)) { namespaceManager.CreateQueue(archiveQueueName); } archiveQueue = QueueClient.CreateFromConnectionString(ConfigurationManager.AppSettings["ServiceBusCS"], archiveQueueName); if (!namespaceManager.TopicExists(responseTopicName)) { namespaceManager.TopicExists(responseTopicName); } responseTopic = TopicClient.CreateFromConnectionString(ConfigurationManager.AppSettings["ServiceBusCS"],responseTopicName); } public static ServiceBusHelper Instance { get { return instance; } } public void EnququeJobToDo(Job job, string corrId) { // Compose the message BrokeredMessage msg = new BrokeredMessage(job); msg.CorrelationId = corrId; // Send the message filteringQueue.Send(msg); } }

Como puede ver, no cierro la conexión ( QueueClient.Close() ), ¿ dónde debo cerrar la conexión? implementar un IDisposable con Dispose ()?

Si hay un mejor enfoque, agradezco si pudieras compartirlo conmigo.

Este código proviene de una API web (Azure Cloud Service) con una carga de trabajo decente.

Actualizar

Actualicé mi clase con Dispose() siguiente manera:

public void Dispose() { if (msgFactory != null) { msgFactory.Close(); } }