/// <summary> /// Registers the queue connection and sets the mode if not already set.. /// </summary> /// <param name="conn">The connection.</param> private void RegisterConnectionQueue(ManualFabricConnection conn) { ConnectionAdd(conn, CommunicationBridgeMode.RoundRobin); mConnectionsListen.Add(conn.Id); conn.Receive = Receive; }
private void ConnectionAdd(ManualFabricConnection conn, CommunicationBridgeMode?validateMode = null) { lock (syncConnection) { if (validateMode.HasValue && !Mode.HasValue) { Mode = validateMode; } else if (validateMode.HasValue && Mode.HasValue && Mode != validateMode) { throw new ArgumentOutOfRangeException("validateMode", $"validateMode does not match {Mode}"); } } if (!mConnections.TryAdd(conn.Id, conn)) { throw new ArgumentOutOfRangeException("conn.Id", "The connection already exists"); } switch (Mode) { case CommunicationBridgeMode.RoundRobin: mOutgoing.TryAdd(cnDefault, new QueueHolder()); break; case CommunicationBridgeMode.Broadcast: mOutgoing.TryAdd(conn.Subscription.ToLowerInvariant(), new QueueHolder()); break; } }
/// <summary> /// Registers the connection. /// </summary> /// <param name="conn">The connection.</param> /// <exception cref="ArgumentOutOfRangeException">Thrown if the connection channel id does not match.</exception> private void RegisterConnection(ManualFabricConnection conn) { if (!conn.Channel.Equals(Id, StringComparison.InvariantCultureIgnoreCase)) { throw new ArgumentOutOfRangeException($"Connection channel identifier '{conn.Channel}' does not match the Channel '{Id}'"); } switch (conn.Mode) { case ManualFabricConnectionMode.Queue: RegisterConnectionQueue(conn); break; case ManualFabricConnectionMode.Subscription: RegisterConnectionSubscription(conn); break; case ManualFabricConnectionMode.Transmit: RegisterConnectionTransmit(conn); break; default: throw new ArgumentOutOfRangeException("conn.Mode", $"The connection mode was unexpected: {conn.Mode}"); } }
/// <summary> /// Creates a connection. /// </summary> /// <param name="mode">The connection mode.</param> /// <param name="subscription">The optional subscription identifier.</param> /// <returns></returns> public ManualFabricConnection CreateConnection(ManualFabricConnectionMode mode, string subscription = null) { var conn = new ManualFabricConnection(mode, Id, subscription); RegisterConnection(conn); return(conn); }
/// <summary> /// Registers the queue connection and sets the mode if not already set.. /// </summary> /// <param name="conn">The connection.</param> private void RegisterConnectionQueue(ManualFabricConnection conn) { ConnectionAdd(conn, FabricMode.Queue); mConnectionsListen.Add(conn.Id); conn.Receive = Receive; }
/// <summary> /// Registers the subscription connection and sets the mode if not already set. /// </summary> /// <param name="conn">The connection.</param> /// <exception cref="ArgumentNullException">conn.Subscription - Subscription Id cannot be null.</exception> private void RegisterConnectionSubscription(ManualFabricConnection conn) { if (conn.Subscription == null) { throw new ArgumentNullException("conn.Subscription", "Subscription Id cannot be null."); } ConnectionAdd(conn, CommunicationBridgeMode.Broadcast); mConnectionsListen.Add(conn.Id); conn.Receive = Receive; }
private IEnumerable <FabricMessage> Receive(ManualFabricConnection conn, int?count) { string queueName = (Mode == CommunicationBridgeMode.RoundRobin)?cnDefault:conn.Subscription; QueueHolder queue; if (mOutgoing.TryGetValue(queueName, out queue)) { count = count ?? 1; FabricMessage message; while (count.Value > 0 && queue.TryDequeue(out message)) { message.ReleaseSet((success, id) => Complete(queueName, message, success, id)); yield return(message); count--; } } yield break; }
private void Transmit(ManualFabricConnection conn, FabricMessage message) { if (!Mode.HasValue) { throw new ArgumentException("Mode is not configured."); } QueueHolder queue; switch (Mode.Value) { case CommunicationBridgeMode.RoundRobin: if (mOutgoing.TryGetValue(cnDefault, out queue)) { queue.Enqueue(message); } break; case CommunicationBridgeMode.Broadcast: mOutgoing.Values.AsParallel().ForEach((c) => c.Enqueue(message)); break; } }
/// <summary> /// Registers the transmit connection. /// </summary> /// <param name="conn">The connection.</param> private void RegisterConnectionTransmit(ManualFabricConnection conn) { ConnectionAdd(conn); mConnectionsTransmit.Add(conn.Id); conn.Transmit = Transmit; }