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