コード例 #1
0
        /// <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;
        }
コード例 #2
0
        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;
            }
        }
コード例 #3
0
        /// <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}");
            }
        }
コード例 #4
0
        /// <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);
        }
コード例 #5
0
        /// <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;
        }
コード例 #6
0
        /// <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;
        }
コード例 #7
0
        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;
        }
コード例 #8
0
        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;
            }
        }
コード例 #9
0
 /// <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;
 }