예제 #1
0
        public void StartListen()
        {
            // 打印状态日志
            _context.LogSession.Print(LogLevel.Debug, _context.SessionId,
                                      $"Downlink message processer started, thread:{Thread.CurrentThread.ManagedThreadId}.");

            // 首先接收RmtGenMessage
            _messageQueue = _context.MessageTransceiver.MessageQueue;
            MessageBase   message       = _messageQueue.WaitUntilMessageCome();
            RmtGenMessage rmtGenMessage = (RmtGenMessage)message;

            if (null == rmtGenMessage)
            {
                throw new TestflowRuntimeException(ModuleErrorCode.InvalidMessageReceived,
                                                   _context.I18N.GetFStr("InvalidMessageReceived", message.GetType().Name));
            }
            _context.RmtGenMessage = rmtGenMessage;

            while (!_context.Cancellation.IsCancellationRequested)
            {
                message = _messageQueue.WaitUntilMessageCome();
                if (null == message)
                {
                    continue;
                }
                switch (message.Type)
                {
                case MessageType.Ctrl:
                    ProcessControlMessage((ControlMessage)message);
                    break;

                case MessageType.Debug:
                    ProcessDebugMessage((DebugMessage)message);
                    break;

                case MessageType.Sync:
                    ProcessSyncMessage((ResourceSyncMessage)message);
                    break;

                case MessageType.CallBack:
                    ProcessCallBackMessage((CallBackMessage)message);
                    break;

                // 暂未在Master端实现发送RuntimeError消息的错误
                case MessageType.RmtGen:
                case MessageType.RuntimeError:
                case MessageType.Status:
                case MessageType.TestGen:
                default:
                    throw new TestflowRuntimeException(ModuleErrorCode.InvalidMessageReceived,
                                                       _context.I18N.GetFStr("InvalidMessageReceived", message.GetType().Name));
                }
            }
            _context.LogSession.Print(LogLevel.Debug, _context.SessionId,
                                      $"Downlink message processor stopped, Thread:{Thread.CurrentThread.ManagedThreadId}");
        }
예제 #2
0
        private void MessageProcessingLoop(object queueObj)
        {
            LocalMessageQueue <MessageBase> queue = queueObj as LocalMessageQueue <MessageBase>;

            try
            {
                while (!_cancellation.IsCancellationRequested)
                {
                    MessageBase message = queue.WaitUntilMessageCome();
                    if (null == message)
                    {
                        continue;
                    }
                    bool operationContinue = GetConsumer(message).HandleMessage(message);
                    // 如果消息执行后确认需要停止,则结束消息队列的处理。
                    if (!operationContinue)
                    {
                        break;
                    }
                }
                GlobalInfo.LogService.Print(LogLevel.Info, CommonConst.PlatformSession,
                                            $"Listen thread: {Thread.CurrentThread.Name} is stopped.");
            }
            catch (ThreadAbortException)
            {
                GlobalInfo.LogService.Print(LogLevel.Warn, CommonConst.PlatformLogSession,
                                            $"thread {Thread.CurrentThread.Name} is stopped abnormally");
            }
            catch (Exception ex)
            {
                GlobalInfo.EventQueue.Enqueue(new ExceptionEventInfo(ex));
                GlobalInfo.LogService.Print(LogLevel.Fatal, CommonConst.PlatformLogSession, ex);
                this.Stop();
            }
        }
예제 #3
0
 private void TestStateMonitoring()
 {
     LocalMessageQueue <MessageBase> messageQueue = _slaveContext.MessageTransceiver.MessageQueue;
     // 首先接收RmtGenMessage
     MessageBase message = messageQueue.WaitUntilMessageCome();
 }
예제 #4
0
 public MessageBase Receive()
 {
     return(_messageQueue.WaitUntilMessageCome());
 }