/// <summary> /// 发送出错的重试处理 /// </summary> /// <param name="callArg"></param> /// <param name="state"></param> private void TryRequest(CommandArgument callArg, int state) { callArg.cmdState = state; callArg.OnRequestStateChanged(callArg); if (callArg.tryNum >= RpcEnvironment.NET_COMMAND_RETRY_MAX) { callArg.cmdState = RpcEnvironment.NET_COMMAND_STATE_RETRY_MAX; callArg.OnRequestStateChanged(callArg); } else if (callArg.tryNum >= 0) { callArg.tryNum++; Push(callArg); } }
/// <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); }