internal void DoTransferResponse(SOATransferResponse response) { try { Session session = null; ConatinerLock.EnterReadLock(); ClientSessionList.TryGetValue(response.ClientTransactionID, out session); ConatinerLock.ExitReadLock(); if (session != null) { ConatinerLock.EnterWriteLock(); ClientSessionList.Remove(response.ClientTransactionID); ConatinerLock.ExitWriteLock(); SOAResponse resp = new SOAResponse(); Message msgRet = new Message((int)SOAMessageType.DoSOAResponse); msgRet.MessageHeader.TransactionID = response.ClientTransactionID; resp.IsSuccess = response.IsSuccess; resp.ErrMsg = response.ErrMsg; resp.Result = response.Result; msgRet.SetMessageBody(resp); session.SendMessage(msgRet); var toulp = (Tuple <int, int>)session.Tag; if (SocketApplicationEnvironment.TraceMessage) { LogHelper.Instance.Debug(string.Format("SOA响应耗时,请求序列号:{0},服务号:{1},功能号:{2},用时:{3},结果:{4}", response.ClientTransactionID, toulp.Item1, toulp.Item2, DateTime.Now.Subtract(session.BusinessTimeStamp).TotalMilliseconds + "毫秒", Convert.ToBase64String(response.Result))); } } else { Exception ex = new Exception(string.Format("DoTransferResponse(SOATransferResponse response)失败,请求序列号:{0}", response.ClientTransactionID)); ex.Data.Add("response.ClientId", response.ClientId); LogHelper.Instance.Error("DoTransferResponse出错", ex); } } catch (Exception ex) { ex.Data.Add("请求序列号", response.ClientTransactionID); LogHelper.Instance.Error("DoTransferResponse出错", ex); } }
internal void DoTransferRequest(Session session, string msgTransactionID, SOARequest request) { session.BusinessTimeStamp = DateTime.Now; session.Tag = new Tuple <int, int>(request.ServiceNo, request.FuncId); SOAResponse resp = new SOAResponse(); Message msgRet = new Message((int)SOAMessageType.DoSOAResponse); msgRet.MessageHeader.TransactionID = msgTransactionID; resp.IsSuccess = true; //调用本地的方法 if (request.ServiceNo == 0) { try { var obj = DoRequest(request.FuncId, request.Param); resp.Result = EntityBuf.EntityBufCore.Serialize(obj); } catch (Exception ex) { resp.IsSuccess = false; resp.ErrMsg = ex.Message; } msgRet.SetMessageBody(resp); session.SendMessage(msgRet); } else { //查询服务 var serviceInfos = ServiceContainer.FindAll(p => p.ServiceNo.Equals(request.ServiceNo)); if (serviceInfos == null || serviceInfos.Count == 0) { resp.IsSuccess = false; resp.ErrMsg = string.Format("{0}服务未注册。", request.ServiceNo); } if (resp.IsSuccess) { ESBServiceInfo serviceInfo = null; if (serviceInfos.Count == 1) { serviceInfo = serviceInfos[0]; } else { Random rd = new Random(); var idx = rd.Next(1, serviceInfos.Count + 1); serviceInfo = serviceInfos[idx - 1]; } try { if (DateTime.Now.Subtract(serviceInfo.Session.LastSessionTime).TotalSeconds > 30) { lock (LockObj) { ServiceContainer.Remove(serviceInfo); serviceInfo.Session.Close(); } serviceInfo = ServiceContainer.FindAll(p => p.ServiceNo.Equals(request.ServiceNo)).LastOrDefault(); if (serviceInfo == null) { throw new Exception(string.Format("{0}服务可能不可用,30秒无应答。", request.ServiceNo)); } } string clientid = session.SessionID; SOATransferRequest transferrequest = new SOATransferRequest(); transferrequest.ClientId = clientid; transferrequest.FundId = request.FuncId; transferrequest.Param = request.Param; transferrequest.ClientTransactionID = msgTransactionID; Message msg = new Message((int)SOAMessageType.DoSOATransferRequest); msg.MessageHeader.TransactionID = SocketApplicationComm.GetSeqNum(); msg.SetMessageBody(transferrequest); try { ConatinerLock.EnterWriteLock(); ClientSessionList.Add(msgTransactionID, session); } finally { ConatinerLock.ExitWriteLock(); } if (serviceInfo.Session.SendMessage(msg)) { //LogHelper.Instance.Debug(string.Format("发送SOA请求,请求序列:{0},服务号:{1},功能号:{2}", // msgTransactionID, request.ServiceNo, request.FuncId)); return; } else { try { ConatinerLock.EnterWriteLock(); ClientSessionList.Remove(msgTransactionID); } finally { ConatinerLock.ExitWriteLock(); } } //var result = SendMessageAnsy<byte[]>(serviceInfo.Session, msg); //resp.Result = result; } catch (Exception ex) { OnError(ex); resp.IsSuccess = false; resp.ErrMsg = ex.Message; } } if (!resp.IsSuccess) { msgRet.SetMessageBody(resp); session.SendMessage(msgRet); } } }