コード例 #1
0
 /// <summary>
 /// 执行工作
 /// </summary>
 /// <param name="socket"></param>
 /// <returns>返回状态,其中-1会导致重连</returns>
 protected sealed override int DoWork(SubscriberSocket socket)
 {
     byte[] buffer;
     Debug.WriteLine(this.ZmqAddress);
     if (!socket.TryReceiveFrameBytes(timeOut, out buffer))
     {
         //Thread.SpinWait(1);
         return(0);
     }
     try
     {
         var reader = new CommandReader(buffer);
         reader.ReadCommandFromBuffer();
         var cmdMsg = reader.Command;
         try
         {
             var old = RpcEnvironment.SyncCacheCommand(cmdMsg);
             old?.OnRequestStateChanged(cmdMsg);
         }
         catch (Exception ex)
         {
             Trace.WriteLine(ex, GetType().Name + "MessageNotifyTask");
         }
     }
     catch (Exception ex)
     {
         Trace.WriteLine(ex, GetType().Name + "DoWork");
         return(-1);
     }
     return(0);
 }
コード例 #2
0
ファイル: ZmqCommandPump.cs プロジェクト: pingbc/EntityModel
        /// <summary>
        ///     执行处理泵
        /// </summary>
        /// <returns></returns>
        protected void RunPump()
        {
            //登记线程开始
            RpcEnvironment.set_command_thread_start();
            //monitor?.Stop();
            int state = 0;

            Console.WriteLine($"命令请求泵({ZmqAddress})正在启动");
            using (var socket = CreateSocket())
            {
                //monitor = new NetMQMonitor(socket, $"inproc://pump_{Guid.NewGuid()}.rep", SocketEvents.All);
                OptionSocktet(socket);
                socket.Connect(ZmqAddress);
                OnConnected(socket);

                Console.WriteLine($"命令请求泵({ZmqAddress})已启动");

                while (RpcEnvironment.NetState == ZmqNetStatus.Runing)
                {
                    state = DoWork(socket);
                    if (state == -1)
                    {
                        break;
                    }
                }
                socket.Disconnect(ZmqAddress);
            }
            //登记线程关闭
            RpcEnvironment.set_command_thread_end();

            OnTaskEnd(state);
        }
コード例 #3
0
        /// <summary>
        ///     执行销毁时
        /// </summary>
        public static void Destroy()
        {
            RpcEnvironment.CurrentFlow = RpcFlowType.Exiting;
            var cnt = 0;

            while (RpcEnvironment.CurrentFlow == RpcFlowType.Exiting && cnt++ < 30)
            {
                Thread.Sleep(100);
            }
            RpcCore.ShutDown();
            RpcEnvironment.ClearCacheCommand();
            RpcEnvironment.CurrentFlow = RpcFlowType.Destroied;
        }
コード例 #4
0
ファイル: ZmqQuestionPump.cs プロジェクト: pingbc/EntityModel
        /// <summary>
        /// 执行工作
        /// </summary>
        /// <param name="socket"></param>
        /// <returns>返回状态,其中-1会导致重连</returns>
        protected sealed override int DoWork(RequestSocket socket)
        {
            CommandArgument callArg = Pop();

            if (callArg == null)
            {
                return(0);
            }
            RpcEnvironment.CacheCommand(callArg);
            try
            {
                callArg.cmdState = RpcEnvironment.NET_COMMAND_STATE_SENDED;
                //序列化
                var writer = new CommandWriter(callArg);
                writer.WriteCommandToBuffer();
                //发送命令请求
                bool state = socket.TrySendFrame(timeOut, writer.Buffer, writer.DataLen);
                if (!state)
                {
                    TryRequest(callArg, RpcEnvironment.NET_COMMAND_STATE_NETERROR);
                    return(-1); //出错了
                }
                //log_debug4(DEBUG_CALL, 3, "%s:命令%d(%s)发送成功(%d)", address, call_arg.cmd_id, call_arg.cmd_identity, zmq_result);
                //接收处理反馈
                byte[] result;
                state = socket.TryReceiveFrameBytes(timeOut, out result);
                if (!state)
                {
                    TryRequest(callArg, RpcEnvironment.NET_COMMAND_STATE_UNKNOW);
                    return(-1); //出错了
                }
                if (result[0] == '0')
                {
                    TryRequest(callArg, RpcEnvironment.NET_COMMAND_STATE_UNKNOW);
                }
                else
                {
                    callArg.cmdState = RpcEnvironment.NET_COMMAND_STATE_WAITING;
                    callArg.OnRequestStateChanged(callArg);
                }
            }
            catch (Exception ex)
            {
                Trace.WriteLine(ex, GetType().Name + "DoWork");
                callArg.cmdState = RpcEnvironment.NET_COMMAND_STATE_CLIENT_UNKNOW;
                return(-1);
            }
            return(1);
        }
コード例 #5
0
        /// <summary>
        ///     执行处理泵
        /// </summary>
        /// <returns></returns>
        protected void RunPump()
        {
            //登记线程开始
            RpcEnvironment.set_command_thread_start();
            //monitor?.Stop();
            int state = 0;

            Console.WriteLine($"命令请求泵({ZmqAddress})正在启动{this.GetType().Name}");
            using (var socket = CreateSocket())
            {
                //monitor = new NetMQMonitor(socket, $"inproc://pump_{Guid.NewGuid()}.rep", SocketEvents.All);
                OptionSocktet(socket);
                socket.Connect(ZmqAddress);
                OnConnected(socket);

                Console.WriteLine($"命令请求泵({ZmqAddress})已启动{this.GetType().Name}");

                while (m_state == 4 && RpcEnvironment.NetState == ZmqNetStatus.Runing)
                {
                    state = DoWork(socket);
                    if (state == -1)
                    {
                        Console.WriteLine($"命令请求泵({ZmqAddress})正在错误状态{this.GetType().Name}");
                        break;
                    }
                }
                Console.WriteLine($"命令请求泵({ZmqAddress})正在关闭{this.GetType().Name}");
                try
                {
                    OnDeConnected(socket);
                }
                catch (Exception e)
                {
                }
                try
                {
                    socket.Disconnect(ZmqAddress);
                }
                catch (Exception e)
                {
                }
            }
            Console.WriteLine($"命令请求泵({ZmqAddress})已关闭{this.GetType().Name}");
            //登记线程关闭
            RpcEnvironment.set_command_thread_end();
            thread = null;
            OnTaskEnd(state);
        }
コード例 #6
0
ファイル: ZmqApiCallPump.cs プロジェクト: cuiopen/ZeroNet
        /// <summary>
        /// 执行工作
        /// </summary>
        /// <param name="socket"></param>
        /// <returns>返回状态,其中-1会导致重连</returns>
        protected sealed override int DoWork(RequestSocket socket)
        {
            CommandArgument callArg = Pop();

            if (callArg == null)
            {
                return(0);
            }
            RpcEnvironment.CacheCommand(callArg);
            try
            {
                bool state;
                //发送命令请求
                state = socket.TrySendFrame(timeOut, callArg.commandName);
                if (!state)
                {
                    return(-1);
                }
                //接收处理反馈
                bool more;
                do
                {
                    string result;
                    state = socket.TryReceiveFrameString(timeOut, out result, out more);
                    if (!state)
                    {
                        return(-1);
                    }
                    if (!string.IsNullOrWhiteSpace(result))
                    {
                        Console.WriteLine(result);
                    }
                } while (more);
            }
            catch (Exception ex)
            {
                OnException(socket, ex);
                callArg.cmdState = RpcEnvironment.NET_COMMAND_STATE_CLIENT_UNKNOW;
                return(-1);
            }
            return(1);
        }
コード例 #7
0
        /// <summary>
        ///     消息处理
        /// </summary>
        /// <param name="sender">发送者</param>
        /// <param name="arg">最新接收的参数(如果这不是响应状态则与发送者相同)</param>
        public static void OnRequestStateChanged(CommandArgument sender, CommandArgument arg)
        {
            switch (arg.cmdState)
            {
            case RpcEnvironment.NET_COMMAND_STATE_SENDING:
                Message = "正在发送请求";
                return;

            case RpcEnvironment.NET_COMMAND_STATE_UNKNOW_DATA:
                Message = "正在接收远程数据接";
                return;

            case RpcEnvironment.NET_COMMAND_STATE_WAITING:
                Message = "服务器正在处理请求";
                return;

            case RpcEnvironment.NET_COMMAND_STATE_DATA:
                Message = "远程数据推送";
                return;

            case RpcEnvironment.NET_COMMAND_STATE_UNKNOW:
                Message = "服务器未正确响应";
                break;

            case RpcEnvironment.NET_COMMAND_STATE_CRC_ERROR:
                Message = "CRC校验错误";
                break;

            case RpcEnvironment.NET_COMMAND_STATE_NETERROR:
                Message = "发生网络错误";
                break;

            case RpcEnvironment.NET_COMMAND_STATE_RETRY_MAX:
                Message = "超过最大错误重试次数";
                break;

            case RpcEnvironment.NET_COMMAND_STATE_LOGICAL_ERROR:
                Message = "系统内部错误";
                break;

            case RpcEnvironment.NET_COMMAND_STATE_SERVER_UNKNOW:
                Message = "服务器内部错误";
                break;

            case RpcEnvironment.NET_COMMAND_STATE_TIME_OUT:
                Message = "请求超时";
                break;

            case RpcEnvironment.NET_COMMAND_STATE_DATA_REPEAT:
                Message = "应废弃的重复请求";
                break;

            case RpcEnvironment.NET_COMMAND_STATE_ARGUMENT_INVALID:
                Message = "参数数错误";
                break;

            case RpcEnvironment.NET_COMMAND_STATE_SUCCEED:
                Message = "执行成功";
                break;
            }
            sender.RequestStateChanged -= OnRequestStateChanged;
            RpcEnvironment.RemoveCacheCommand(arg);

            sender.OnEnd?.Invoke(arg);
        }