/// <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!"); } } } }
/// <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); } } }
/// <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); } } }
/// <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!"); } } } }
/// <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..."); }