/// <summary> /// Registers with the <see cref="ServiceBusService"/> to produce or consume <see cref="Message"/>s. /// </summary> /// <param name="request">An <see cref="RegistrationRequest"/> containing registration data.</param> public virtual void Register(RegistrationRequest request) { // Initialize if uninitialized. Initialize(); // Save client information if not already present. ClientInfo client; m_clientsLock.EnterUpgradeableReadLock(); try { if (!m_clients.TryGetValue(OperationContext.Current.SessionId, out client)) { m_clientsLock.EnterWriteLock(); try { client = new ClientInfo(OperationContext.Current); m_clients.Add(client.SessionId, client); client.OperationContext.Channel.Faulted += OnChannelFaulted; client.OperationContext.Channel.Closing += OnChannelClosing; } finally { m_clientsLock.ExitWriteLock(); } } } finally { m_clientsLock.ExitUpgradeableReadLock(); } // Retrieve registration information. RegistrationInfo registration; if (request.MessageType == MessageType.Queue) { // Queue m_queuesLock.EnterUpgradeableReadLock(); try { if (!m_queues.TryGetValue(request.MessageName, out registration)) { m_queuesLock.EnterWriteLock(); try { registration = new RegistrationInfo(request); m_queues.Add(request.MessageName, registration); } finally { m_queuesLock.ExitWriteLock(); } } } finally { m_queuesLock.ExitUpgradeableReadLock(); } } else if (request.MessageType == MessageType.Topic) { // Topic m_topicsLock.EnterUpgradeableReadLock(); try { if (!m_topics.TryGetValue(request.MessageName, out registration)) { m_topicsLock.EnterWriteLock(); try { registration = new RegistrationInfo(request); m_topics.Add(request.MessageName, registration); } finally { m_topicsLock.ExitWriteLock(); } } } finally { m_topicsLock.ExitUpgradeableReadLock(); } } else { // Unsupported throw new NotSupportedException(string.Format("Message type '{0}' is not supported by this operation", request.MessageType)); } // Update registration information. if (registration != null) { List<ClientInfo> clients = (request.RegistrationType == RegistrationType.Produce ? registration.Producers : registration.Consumers); lock (clients) { if (!clients.Contains(client)) clients.Add(client); } } }
public PublishContext(Message message, RegistrationInfo registration) { Message = message; Registration = registration; }