Пример #1
0
        /// <summary>
        /// Thread which listens for incoming NetMQMessages from the server and queues them up for handling
        /// </summary>
        private void Listener()
        {
            while (!isDone)
            {
                NetMQMessage message = null;

                if (clientSocket.TryReceiveMultipartMessage(TimeSpan.FromSeconds(1.0), ref message))
                {
                    string typeStr    = message[1].ConvertToString();
                    Type   objectType = Type.GetType(typeStr);

                    System.Reflection.MethodInfo method  = typeof(BsonMagic).GetMethod("DeserializeObject");
                    System.Reflection.MethodInfo generic = method.MakeGenericMethod(objectType);

                    Object[] methodParams = new Object[1] {
                        message[2].ToByteArray()
                    };

                    Object receivedObject = generic.Invoke(null, methodParams);

                    if (DataReceived != null)
                    {
                        DataReceived(receivedObject);
                    }
                    else
                    {
                        throw new ArgumentException("Data was received, but no event handler set!");
                    }
                }
            }
        }
Пример #2
0
        /// <summary>
        /// Thread which listens for incoming NetMQMessages from the server and queues them up for handling
        /// </summary>
        private void Listener()
        {
            while (!isDone)
            {
                NetMQMessage message = null;

                if (clientSocket.TryReceiveMultipartMessage(TimeSpan.FromSeconds(1.0), ref message))
                {
                    receiveQueue.Enqueue(message);
                }
            }
        }
Пример #3
0
        /// <summary>
        /// Thread which listens for incoming NetMQMessages from clients
        /// </summary>
        private void Listener()
        {
            while (!isDone)
            {
                NetMQMessage receivedMsg = null;
                bool         result      = netMqSocket.TryReceiveMultipartMessage(TimeSpan.FromSeconds(1.0), ref receivedMsg);

                if (result)
                {
                    // Add to client list if this is first time this ID has been seen
                    Guid receivedId = new Guid(receivedMsg[0].ToByteArray());

                    if (!clientList.Contains(receivedId))
                    {
                        clientList.Add(receivedId);
                    }

                    // Enqueue for processing
                    receiveQueue.Enqueue(receivedMsg);
                }
            }
        }
Пример #4
0
        /// <summary>
        /// Thread which listens for incoming NetMQMessages from clients
        /// </summary>
        private void Listener()
        {
            while (!isDone)
            {
                NetMQMessage receivedMsg = null;

                if (netMqSocket.TryReceiveMultipartMessage(TimeSpan.FromSeconds(1.0), ref receivedMsg))
                {
                    Guid   receivedId = new Guid(receivedMsg[0].ToByteArray());
                    string typeStr    = receivedMsg[2].ConvertToString();
                    Type   t          = Type.GetType(typeStr);

                    System.Reflection.MethodInfo method  = typeof(BsonMagic).GetMethod("DeserializeObject");
                    System.Reflection.MethodInfo generic = method.MakeGenericMethod(t);

                    Object[] methodParams = new Object[1] {
                        receivedMsg[3].ToByteArray()
                    };
                    Object receivedObject = generic.Invoke(null, methodParams);

                    // Add to client list if this is first time this ID has been seen
                    if (!clientList.Contains(receivedId))
                    {
                        clientList.Add(receivedId);
                    }

                    // Fire event if configured
                    if (DataReceived != null)
                    {
                        DataReceived(receivedObject, receivedId);
                    }
                    else
                    {
                        throw new ArgumentException("Data was received, but no event handler set!");
                    }
                }
            }
        }
Пример #5
0
        /// <summary>
        ///     New non blocking queue, using Thread events for smart control.
        /// </summary>
        private void MessageSenderLoop()
        {
            _logger.Debug("Starting dequeue loop...");
            if (Thread.CurrentThread.Name == null)
            {
                Thread.CurrentThread.Name = "Nyx Borg Message Queue";
            }
            Thread.CurrentThread.Priority = ThreadPriority.Highest;
            while (!_messageLoopToken.IsCancellationRequested)
            {
                if (_messageQueue.Count == 0)
                {
                    _messageSendResetEvent.WaitOne();
                }
                else if (!_isConnected)
                {
                    if (_messageLoopCancelation.IsCancellationRequested)
                    {
                        _messageReplyReceived.OnError(new EndOfStreamException("Message queue is stopping."));
                    }
                    _messageLoopToken.ThrowIfCancellationRequested();
                    _messageSendResetEvent.WaitOne(TimeSpan.FromSeconds(_timeOut));
                    continue;
                }
                // Check if we have messages or if our hub is alive
                if (_messageQueue.Count == 0)
                {
                    continue;
                }
                if (_reqSocket == null)
                {
                    continue;
                }
                // Dequeues message if dequeue on fail is on, else leave this to a later stage
                var           dequeueOnFail = _dequeueOnFail;
                MessageHelper msg;
                lock (MessageQueueSync) msg = dequeueOnFail ? _messageQueue.Dequeue() : _messageQueue.Peek();

                var readonlyMsg = msg.Message.AsReadOnly();
                _logger.Trace("{0} message {1}", dequeueOnFail ? "Dequeued" : "Peeked", msg.Message);
                var abort = FilterMessage(msg.Message);
                if (abort)
                {
                    _logger.Debug("Message {0} was not sent.", msg.Message);
                    if (!dequeueOnFail || msg.Retries > _maxFailedRetries)
                    {
                        lock (MessageQueueSync) _messageQueue.Dequeue();
                    }
                    else
                    {
                        msg.Retries++;
                    }
                    if (_messageQueue.Count == 0)
                    {
                        _messageSendResetEvent.Reset();
                    }
                    continue;
                }

                // Reply control
                NetMQMessage mqMessage = null;
                var          retries   = _timeOutRetries;
                var          timeout   = Debugger.IsAttached ? 120000 : _timeOut;
                try
                {
                    _reqSocket.SendMultipartMessage(msg.Message.ToNetMQMessage());
                    var received = false;
                    while (!received && retries > 0)
                    {
                        received = _reqSocket.TryReceiveMultipartMessage(TimeSpan.FromMilliseconds(timeout), ref mqMessage);
                        retries--;
                    }
                }
                catch (Exception ex)
                {
                    _logger.Error("Error sending message. REQ-REP Socket state problem.", ex);
                }

                if (mqMessage == null)
                {
                    _logger.Error("Message with id={0}, failed, due to timeout of {1}ms reached, hub maybe busy.", msg.Message.ShortId(), timeout * retries);
                    NotifyMessageFailedOut(readonlyMsg, "No reply or invalid data return by the hub.");
                    // Here we restart all over again...
                    if (!dequeueOnFail && msg.Retries <= _maxFailedRetries)
                    {
                        _logger.Debug("Requeue message with id={0}.", msg.Message.ShortId());
                        msg.Retries++;
                    }
                    else if (msg.Retries > _maxFailedRetries)
                    {
                        if (!dequeueOnFail)
                        {
                            lock (MessageQueueSync) _messageQueue.Dequeue();
                        }
                    }
                    if (_clearQueueOnFail)
                    {
                        lock (MessageQueueSync) _messageQueue.Clear();
                    }
                    CreateServerSocket();
                    continue;
                }
                // Everything went well lets dequeue if we didn't do that before
                if (!dequeueOnFail)
                {
                    lock (MessageQueueSync) _messageQueue.Dequeue();
                }
                NotifyMessageSentOut(readonlyMsg, true);
                var data = mqMessage.FrameCount > 1 ? mqMessage[2].ConvertToString() : mqMessage.First.ConvertToString();
                _logger.Trace("We did get a reply {0}...", data);
                if (_messageQueue.Count == 0)
                {
                    _messageSendResetEvent.Reset();
                }
            }
            _messageReplyReceived.OnError(new EndOfStreamException("Message queue is stopping."));
            _logger.Debug("Stopping dequeue loop...");
        }