public ServiceBusConnectionContext Subscribe(IList<string> topicNames, Action<int, IEnumerable<BrokeredMessage>> handler, Action<int, Exception> errorHandler, Action<int> openStream) { if (topicNames == null) { throw new ArgumentNullException("topicNames"); } if (handler == null) { throw new ArgumentNullException("handler"); } _trace.TraceInformation("Subscribing to {0} topic(s) in the service bus...", topicNames.Count); var connectionContext = new ServiceBusConnectionContext(_configuration, _namespaceManager, topicNames, _trace, handler, errorHandler, openStream); for (var topicIndex = 0; topicIndex < topicNames.Count; ++topicIndex) { Retry(() => CreateTopic(connectionContext, topicIndex)); } _trace.TraceInformation("Subscription to {0} topics in the service bus Topic service completed successfully.", topicNames.Count); return connectionContext; }
public ServiceBusConnectionContext Subscribe(IList <string> topicNames, Action <int, IEnumerable <BrokeredMessage> > handler, Action <int, Exception> errorHandler, Action <int> openStream) { if (topicNames == null) { throw new ArgumentNullException("topicNames"); } if (handler == null) { throw new ArgumentNullException("handler"); } _trace.TraceInformation("Subscribing to {0} topic(s) in the service bus...", topicNames.Count); var connectionContext = new ServiceBusConnectionContext(_configuration, _namespaceManager, topicNames, _trace, handler, errorHandler, openStream); for (var topicIndex = 0; topicIndex < topicNames.Count; ++topicIndex) { Retry(() => CreateTopic(connectionContext, topicIndex)); } _trace.TraceInformation("Subscription to {0} topics in the service bus Topic service completed successfully.", topicNames.Count); return(connectionContext); }
public ReceiverContext(int topicIndex, MessageReceiver receiver, ServiceBusConnectionContext connectionContext) { TopicIndex = topicIndex; Receiver = receiver; ReceiveTimeout = DefaultReadTimeout; ConnectionContext = connectionContext; }
private void CreateSubscription(ServiceBusConnectionContext connectionContext, int topicIndex) { lock (connectionContext.SubscriptionsLock) { if (connectionContext.IsDisposed) { return; } string topicName = connectionContext.TopicNames[topicIndex]; // Create a random subscription string subscriptionName = Guid.NewGuid().ToString(); try { var subscriptionDescription = new SubscriptionDescription(topicName, subscriptionName); // This cleans up the subscription while if it's been idle for more than the timeout. subscriptionDescription.AutoDeleteOnIdle = _idleSubscriptionTimeout; _namespaceManager.CreateSubscription(subscriptionDescription); _trace.TraceInformation("Creation of a new subscription {0} for topic {1} in the service bus completed successfully.", subscriptionName, topicName); } catch (MessagingEntityAlreadyExistsException) { // The entity already exists _trace.TraceInformation("Creation of a new subscription {0} for topic {1} threw an MessagingEntityAlreadyExistsException.", subscriptionName, topicName); } // Create a receiver to get messages string subscriptionEntityPath = SubscriptionClient.FormatSubscriptionPath(topicName, subscriptionName); MessageReceiver receiver = _factory.CreateMessageReceiver(subscriptionEntityPath, ReceiveMode.ReceiveAndDelete); _trace.TraceInformation("Creation of a message receive for subscription entity path {0} in the service bus completed successfully.", subscriptionEntityPath); connectionContext.SetSubscriptionContext(new SubscriptionContext(topicName, subscriptionName, receiver), topicIndex); var receiverContext = new ReceiverContext(topicIndex, receiver, connectionContext); var task = Task.Run(() => ProcessMessages(receiverContext)); _processMessagesTasks.GetOrAdd(task, false); task.ContinueWith(t => { bool value; _processMessagesTasks.TryRemove(task, out value); }); // Open the stream connectionContext.OpenStream(topicIndex); } }
private void CreateTopic(ServiceBusConnectionContext connectionContext, int topicIndex) { lock (connectionContext.TopicClientsLock) { if (connectionContext.IsDisposed) { return; } string topicName = connectionContext.TopicNames[topicIndex]; if (!_namespaceManager.TopicExists(topicName)) { try { _trace.TraceInformation("Creating a new topic {0} in the service bus...", topicName); _namespaceManager.CreateTopic(topicName); _trace.TraceInformation("Creation of a new topic {0} in the service bus completed successfully.", topicName); } catch (MessagingEntityAlreadyExistsException) { // The entity already exists _trace.TraceInformation("Creation of a new topic {0} threw an MessagingEntityAlreadyExistsException.", topicName); } } // Create a client for this topic TopicClient topicClient = TopicClient.CreateFromConnectionString(_connectionString, topicName); if (_configuration.RetryPolicy != null) { topicClient.RetryPolicy = _configuration.RetryPolicy; } else { topicClient.RetryPolicy = RetryExponential.Default; } connectionContext.SetTopicClients(topicClient, topicIndex); _trace.TraceInformation("Creation of a new topic client {0} completed successfully.", topicName); } CreateSubscription(connectionContext, topicIndex); }
private void CreateTopic(ServiceBusConnectionContext connectionContext, int topicIndex) { lock (connectionContext.TopicClientsLock) { if (connectionContext.IsDisposed) { return; } string topicName = connectionContext.TopicNames[topicIndex]; if (!_namespaceManager.TopicExists(topicName)) { try { _trace.TraceInformation("Creating a new topic {0} in the service bus...", topicName); _namespaceManager.CreateTopic(topicName); _trace.TraceInformation("Creation of a new topic {0} in the service bus completed successfully.", topicName); } catch (MessagingEntityAlreadyExistsException) { // The entity already exists _trace.TraceInformation("Creation of a new topic {0} threw an MessagingEntityAlreadyExistsException.", topicName); } } // Create a client for this topic TopicClient topicClient = TopicClient.CreateFromConnectionString(_connectionString, topicName); if (_configuration.RetryPolicy != null) { topicClient.RetryPolicy = _configuration.RetryPolicy; } else { topicClient.RetryPolicy = RetryExponential.Default; } connectionContext.SetTopicClients(topicClient, topicIndex); _trace.TraceInformation("Creation of a new topic client {0} completed successfully.", topicName); } CreateSubscription(connectionContext, topicIndex); }
public void Subscribe(ServiceBusConnectionContext connectionContext) { if (connectionContext == null) { throw new ArgumentNullException("connectionContext"); } _trace.TraceInformation("Subscribing to {0} topic(s) in the service bus...", connectionContext.TopicNames.Count); connectionContext.NamespaceManager = _namespaceManager; for (var topicIndex = 0; topicIndex < connectionContext.TopicNames.Count; ++topicIndex) { Retry(() => CreateTopic(connectionContext, topicIndex)); } _trace.TraceInformation("Subscription to {0} topics in the service bus Topic service completed successfully.", connectionContext.TopicNames.Count); }
public void Subscribe(ServiceBusConnectionContext connectionContext) { if (connectionContext == null) { throw new ArgumentNullException("connectionContext"); } _trace.TraceInformation("Subscribing to {0} topic(s) in the service bus...", connectionContext.TopicNames.Count); connectionContext.NamespaceManager = _namespaceManager; for (var topicIndex = 0; topicIndex < connectionContext.TopicNames.Count; ++topicIndex) { Retry(() => CreateTopic(connectionContext, topicIndex)); } _trace.TraceInformation("Subscription to {0} topics in the service bus Topic service completed successfully.", connectionContext.TopicNames.Count); }
public ServiceBusMessageBus(IDependencyResolver resolver, ServiceBusScaleoutConfiguration configuration) : base(resolver, configuration) { if (configuration == null) { throw new ArgumentNullException("configuration"); } // Retrieve the trace manager var traceManager = resolver.Resolve<ITraceManager>(); _trace = traceManager["SignalR." + typeof(ServiceBusMessageBus).Name]; _connection = new ServiceBusConnection(configuration, _trace); _topics = Enumerable.Range(0, configuration.TopicCount) .Select(topicIndex => SignalRTopicPrefix + "_" + configuration.TopicPrefix + "_" + topicIndex) .ToArray(); _connectionContext = new ServiceBusConnectionContext(configuration, _topics, _trace, OnMessage, OnError, Open); ThreadPool.QueueUserWorkItem(Subscribe); }
public ServiceBusMessageBus(IDependencyResolver resolver, ServiceBusScaleoutConfiguration configuration) : base(resolver, configuration) { if (configuration == null) { throw new ArgumentNullException("configuration"); } // Retrieve the trace manager var traceManager = resolver.Resolve <ITraceManager>(); _trace = traceManager["SignalR." + typeof(ServiceBusMessageBus).Name]; _connection = new ServiceBusConnection(configuration, _trace); _topics = Enumerable.Range(0, configuration.TopicCount) .Select(topicIndex => SignalRTopicPrefix + "_" + configuration.TopicPrefix + "_" + topicIndex) .ToArray(); _connectionContext = new ServiceBusConnectionContext(configuration, _topics, _trace, OnMessage, OnError, Open); ThreadPool.QueueUserWorkItem(Subscribe); }
public ReceiverContext(int topicIndex, MessageReceiver receiver, ServiceBusConnectionContext connectionContext) { TopicIndex = topicIndex; Receiver = receiver; ReceiveTimeout = DefaultReadTimeout; ConnectionContext = connectionContext; }
private void CreateSubscription(ServiceBusConnectionContext connectionContext, int topicIndex) { lock (connectionContext.SubscriptionsLock) { if (connectionContext.IsDisposed) { return; } string topicName = connectionContext.TopicNames[topicIndex]; // Create a random subscription string subscriptionName = Guid.NewGuid().ToString(); try { var subscriptionDescription = new SubscriptionDescription(topicName, subscriptionName); // This cleans up the subscription while if it's been idle for more than the timeout. subscriptionDescription.AutoDeleteOnIdle = _idleSubscriptionTimeout; _namespaceManager.CreateSubscription(subscriptionDescription); _trace.TraceInformation("Creation of a new subscription {0} for topic {1} in the service bus completed successfully.", subscriptionName, topicName); } catch (MessagingEntityAlreadyExistsException) { // The entity already exists _trace.TraceInformation("Creation of a new subscription {0} for topic {1} threw an MessagingEntityAlreadyExistsException.", subscriptionName, topicName); } // Create a receiver to get messages string subscriptionEntityPath = SubscriptionClient.FormatSubscriptionPath(topicName, subscriptionName); MessageReceiver receiver = _factory.CreateMessageReceiver(subscriptionEntityPath, ReceiveMode.ReceiveAndDelete); _trace.TraceInformation("Creation of a message receive for subscription entity path {0} in the service bus completed successfully.", subscriptionEntityPath); connectionContext.SetSubscriptionContext(new SubscriptionContext(topicName, subscriptionName, receiver), topicIndex); var receiverContext = new ReceiverContext(topicIndex, receiver, connectionContext); ProcessMessages(receiverContext); // Open the stream connectionContext.OpenStream(topicIndex); } }
private void Subscribe(object state) { _connectionContext = _connection.Subscribe(_topics, OnMessage, OnError, Open); }
private void Subscribe(object state) { _connectionContext = _connection.Subscribe(_topics, OnMessage, OnError, Open); }