protected override void AsyncExecute(string serviceName, long pidx, long idx, WQMessage msg) { long t = DateTime.Now.Ticks; try { PlugingItem service = services[serviceName]; Log.Write(LogAction.Info, className, "AsyncExecute", serviceName, DateTime.Now.Ticks - t, "准备异步处理:serviceName:" + serviceName + ",service.RoutingGroupName:" + service.RoutingGroupName + ",msg.TransactionID:" + msg.TransactionID + ",pidx:" + pidx + ",idx:" + idx); //Dictionary<long, Dictionary<long, string>> groups = ServiceConfigs.ServiceGroups; Dictionary<long, string> group = null; long subIdx = msg.SubRoutingKey; foreach (long pgk in groups.Keys) { if ((pidx & pgk) != 0) { group = groups[pgk]; foreach (long gk in group.Keys) { if ((subIdx & gk) != 0) AsyncExecuteItem(serviceName, msg, pidx, idx, gk, group[gk]); } } } } catch (Exception e) { Log.Write(LogAction.Error, className, "AsyncExecute", serviceName, DateTime.Now.Ticks - t, string.Format(errorFormat, serviceName, msg.ToKeyString() + ",pidx:" + pidx + ",idx:" + idx, e.ToString())); } }
public override object ExecuteMessageRequest(string serviceName, WQMessage message) { //1. 按照Key主键更新本地的状态,返回下一个节点的地址 //2. 判断下一个节点地址去空格后是否和上节点去空格后一致. //3. 如果地址不一致,则一请求下一个节点DAC服务 return message.UserToken; }
/// <summary> /// 同步模式:处理 /// </summary> /// <param name="msg"></param> /// <returns></returns> public override object DoExecuteMessageRequest(string serviceName, WQMessage msg, bool async) { // Log.Write("ProxyHandler.DoExecuteMessageRequest:" + services[serviceName].GroupName); Log.Write(LogAction.Info, className, "DoExecuteMessageRequest", serviceName, -1, string.Format(startFormat, serviceName, msg.TransactionID)); long t = DateTime.Now.Ticks; string data = (string)SerializeHelper.Serialize(msg.Format, msg.Body); DovaHttpMessage hmsg=msg as DovaHttpMessage; string contentType = hmsg.ContentType; string groupName = services[serviceName].GroupName; using (IDisposable service = ServiceFactory<HttpProxy>.GetServer(groupName).Instance() as IDisposable) { try { Log.Write(LogAction.Info, className, "DoExecuteMessageRequest", serviceName, DateTime.Now.Ticks - t, "获取目标服务:" + groupName + ",msg:" + msg.TransactionID); t = DateTime.Now.Ticks; string res = (service as HttpProxy).Request(data, hmsg.Method, hmsg.ContentType, hmsg.Encoding); Log.Write(LogAction.Info, className, "DoExecuteMessageRequest", serviceName, DateTime.Now.Ticks - t, "同步代理转发:" + groupName + ":" + serviceName + ",msg:" + msg.ToKeyString()); return SerializeHelper.DeSerialize<DovaResponse>(msg.Format, res); } catch (Exception e) { Log.Write(LogAction.Error, className, "DoExecuteMessageRequest", serviceName, DateTime.Now.Ticks - t, string.Format(errorFormat, serviceName, msg.ToKeyString(), e.ToString())); throw new Exception("消息处理失败:DoExecuteMessageRequest.serviceName:" + serviceName + ",TransactionID:" + msg.TransactionID + ",错误信息:" + e.Message); } } }
/// <summary> /// 同步模式:处理 /// </summary> /// <param name="msg"></param> /// <returns></returns> public override object DoExecuteMessageRequest(string serviceName, WQMessage msg, bool async) { //1. 保存DB,返回msg.TranscactionID //2. 异步调用同步方法 //3. 开启守护线程修补失败的 Log.Write(LogAction.Info, className, "DoExecuteMessageRequest", serviceName, -1, string.Format(startFormat, serviceName, msg.TransactionID)); Routing routing = Routing(serviceName, msg); if (null == routing || routing.EmptyHandlerName.Length > 0) { return EmptyRouting(serviceName, msg, async); } int rtn = -1; msg.ServiceName = serviceName; long pidx = routing.ParentGroupIndex; long idx = routing.GroupIndex; rtn = MessageDao.Save(serviceName, msg, (int)DealStatus.Dealing, pidx, idx); Log.Write(LogAction.Info, className, "DoExecuteMessageRequest", serviceName, -1, msg.TransactionID + ",保存消息返回值:" + rtn); if (rtn > 0) { AsyncDelegate ad = new AsyncDelegate(AsyncExecute); ad.BeginInvoke(serviceName, pidx, idx, msg, null, null); } return (rtn > 0); }
/// <summary> /// 同步模式:处理 /// </summary> /// <param name="msg"></param> /// <returns></returns> public override object ExecuteMessageRequest(string serviceName, WQMessage msg) { Log.Write(LogAction.Info, serviceName, className, "ExecuteMessageRequest", 0, msg.ToString()); DovaResponse res = new DovaResponse(); if (msg.Body != null) res.Body = msg.Body.ToString(); else res.Body = "请求的body为空"; res.TransactionID = msg.TransactionID; res.Status = 1; res.Message = "这是一个对服务:" + serviceName + "的消息响应"; return res; }
public static int Save(string serviceName, WQMessage msg, int status) { int rtn = -1; long t = DateTime.Now.Ticks; try { DbParameter[] pars = new DbParameter[4]; DbParameter p = null; pars[0] = dac.CreateParameter("TransactionID", msg.TransactionID); pars[1] = dac.CreateParameter("ServiceName", serviceName); pars[2] = dac.CreateParameter("Status", status); pars[3] = dac.CreateParameter("MessageData", SerializeHelper.SerializeToBytes(msg), System.Data.DbType.Binary); rtn = dac.ExecuteNonQuery("SaveDovaMessageSP", System.Data.CommandType.StoredProcedure, pars); Log.Write(LogAction.Dao, className, "Save",serviceName, DateTime.Now.Ticks - t, "保存消息:" + msg.TransactionID + ";KeyID:" + msg.KeyID + ";status:" + status); } catch (Exception e) { Log.Write(LogAction.Error, className, "Save",serviceName, DateTime.Now.Ticks - t, "msg.TransactionID:" + msg.TransactionID + ";Error:" + e.Message); } return rtn; }
protected object EmptyRouting(string serviceName, WQMessage msg, bool async) { try { IMessageHandler handler = null; PlugingItem plug = services[serviceName]; string emptyHandlerName = ""; if (!routings.ContainsKey(plug.RoutingGroupName) || !routings[plug.RoutingGroupName].ContainsKey(msg.RoutingKey)) { Log.Write(LogAction.Info, className, "EmptyRouting" , serviceName, -1,string.Format(startFormat, serviceName, "没有找到路由,由服务默认空Handler处理:RoutingKey:" + msg.RoutingKey + ",msg:" + msg.ToKeyString())); emptyHandlerName = services[serviceName].EmptyHandlerName; } else { Routing routing = routings[plug.RoutingGroupName][msg.RoutingKey]; emptyHandlerName = routing.EmptyHandlerName; Log.Write(LogAction.Info, className, "EmptyRouting" , serviceName, -1, string.Format(startFormat, serviceName,"路由配置为空处理,由名为 " + emptyHandlerName + " 的PlugItem对应处理类处理:routing:" + routing + ",msg:" + msg.ToKeyString())); } if (emptyHandlerName != string.Empty) { handler = LoadHandler(emptyHandlerName, msg); long t = DateTime.Now.Ticks; object o = handler.DoExecuteMessageRequest(serviceName, msg, async); Log.Write(LogAction.Info, className, "EmptyRouting" , serviceName, DateTime.Now.Ticks - t, string.Format(endFormat, serviceName, "msg:" + msg.ToKeyString())); return o; } else { Log.Write(LogAction.Info, className, "EmptyRouting", serviceName,-1, string.Format(errorFormat, serviceName, "msg:" + msg.ToKeyString(),"没有找到空处理类:")); throw new Exception("消息处理失败:EmptyRouting.serviceName:" + serviceName + ",TransactionID:" + msg.TransactionID + ",错误信息: 消息没有正确的RoutingKey,并且没有指定空处理类"); } } catch (Exception e) { Log.Write(LogAction.Error, className, "EmptyRouting", serviceName, -1, string.Format(errorFormat, serviceName, "msg:" + msg.ToKeyString(),e.ToString())); throw new Exception("消息处理失败:EmptyRouting.serviceName:" + serviceName + ",TransactionID:" + msg.TransactionID + ",错误信息:" + e.Message); } }
/// <summary> /// 同步模式:处理 /// </summary> /// <param name="msg"></param> /// <returns></returns> public override object DoExecuteMessageRequest(string serviceName, WQMessage msg, bool async) { // Log.Write("ProxyHandler.DoExecuteMessageRequest:" + services[serviceName].GroupName); Log.Write(LogAction.Info, className, "DoExecuteMessageRequest" , serviceName, -1, string.Format(startFormat, serviceName, msg.TransactionID)); long t = DateTime.Now.Ticks; string groupName = services[serviceName].GroupName; using (IDisposable service = ServiceFactory<IMessageService>.GetServer(groupName).Instance() as IDisposable) { try { Log.Write(LogAction.Info, className, "DoExecuteMessageRequest", serviceName, DateTime.Now.Ticks - t, "获取目标服务:"+groupName+",msg:" + msg.TransactionID); t = DateTime.Now.Ticks; object o = (service as IMessageService).RequestMessage(serviceName, msg); Log.Write(LogAction.Info, className, "DoExecuteMessageRequest", serviceName, DateTime.Now.Ticks - t, "同步代理转发:"+groupName+":"+serviceName+",msg:" + msg.ToKeyString()); return o; } catch (Exception e) { Log.Write(LogAction.Error, className, "DoExecuteMessageRequest", serviceName, DateTime.Now.Ticks - t, string.Format(errorFormat, serviceName, msg.ToKeyString(), e.ToString())); throw new Exception("消息处理失败:DoExecuteMessageRequest.serviceName:" + serviceName + ",TransactionID:" + msg.TransactionID + ",错误信息:" + e.Message); } } }
/// <summary> /// 同步模式:处理 /// </summary> /// <param name="msg"></param> /// <returns></returns> public override object DoExecuteMessageRequest(string serviceName, WQMessage msg, bool async) { Log.Write(LogAction.Info, className, "DoExecuteMessageRequest" , serviceName, -1, string.Format(startFormat, serviceName, msg.TransactionID)); Routing routing = Routing(serviceName, msg); if (null == routing || routing.EmptyHandlerName.Length > 0) { return EmptyRouting(serviceName, msg, async); } string svcName = routing.GroupName; long t = DateTime.Now.Ticks; DebugLog("DoExecuteMessageRequest:svcName=" + svcName); using (IDisposable service = ServiceFactory<IMessageService>.GetServer(svcName).Instance() as IDisposable) { try { Log.Write(LogAction.Info, className, "DoExecuteMessageRequest" , serviceName, DateTime.Now.Ticks - t, "获取路由目标服务:" + svcName + ",msg:" + msg.TransactionID); t = DateTime.Now.Ticks; object o = (service as IMessageService).RequestMessage(serviceName, msg); Log.Write(LogAction.Info, className, "DoExecuteMessageRequest" , serviceName, DateTime.Now.Ticks - t, "同步路由代理转发:" + svcName +":"+serviceName+ ",msg:" + msg.ToKeyString()); return o; } catch (Exception e) { Log.Write(LogAction.Error, className, "DoExecuteMessageRequest" , serviceName, DateTime.Now.Ticks - t, string.Format(errorFormat, serviceName,msg.ToKeyString(), e.ToString())); throw new Exception("消息处理失败:DoExecuteMessageRequest.serviceName:" + serviceName + ",TransactionID:" + msg.TransactionID + ",错误信息:" + e.Message); } } }
/// <summary> /// 异步根据主题发送自定义消息 /// </summary> /// <param name="topicID"></param> /// <param name="msg"></param> /// <returns></returns> public bool AsyncRequestMessages(string serviceName, WQMessage[] msg) { int n = msg.Length; int i = 0; foreach (WQMessage m in msg) { if (MessageHandler.AsyncExecuteMessage(serviceName, m)) i++; } return i == n; }
public void SendOneWay(WQMessage msg) { MessageHandler.Execute(msg.ServiceName, msg, msg.Async); }
/// <summary> /// 异步根据主题发送自定义消息 /// </summary> /// <param name="topicID"></param> /// <param name="msg"></param> /// <returns></returns> public bool AsyncRequestMessage(string serviceName, WQMessage msg) { return MessageHandler.AsyncExecuteMessage(serviceName, msg); }
public DovaResponse Test(WQMessage msg) { DovaResponse res = new DovaResponse(); if (msg.Body != null) res.Body = msg.Body.ToString(); else res.Body = "请求的body为空"; res.TransactionID = msg.TransactionID; res.Status = 1; res.Message = "测试响应消息:"; return res; }
public object Send(WQMessage msg) { return MessageHandler.Execute(msg.ServiceName, msg, msg.Async); }
/// <summary> /// 同步根据主题发送自定义消息 /// </summary> /// <param name="topicID"></param> /// <param name="msg"></param> /// <returns></returns> public DovaResponse RequestMessage(WQMessage msg) { long t = DateTime.Now.Ticks; //if (msg.Format == "raw") msg.Body = SerializeHelper.Serialize(msg.Format, msg.Body); DovaResponse res = null; try { object o = MessageHandler.ExecuteMessage(msg.ServiceName, msg, false); //if (msg.Format == "raw") res = SerializeHelper.DeSerialize<DovaResponse>(msg.Format, o); // else // res = o as DovaResponse; } catch (Exception e) { Log.Write(LogAction.Error, "MessageService", "RequestMessage", msg.ServiceName, DateTime.Now.Ticks - t, msg.ToKeyString() + ";" + e.ToString()); } return res; }
/// <summary> /// 异步根据主题发送自定义消息 /// </summary> /// <param name="topicID"></param> /// <param name="msg"></param> /// <returns></returns> public bool AsyncRequestMessage(WQMessage msg) { return MessageHandler.AsyncExecuteMessage(msg.ServiceName, msg); }
/// <summary> /// 同步根据主题发送自定义消息 /// </summary> /// <param name="topicID"></param> /// <param name="msg"></param> /// <returns></returns> public object RequestMessage(string serviceName, WQMessage msg) { return MessageHandler.ExecuteMessage(serviceName, msg, msg.Async); }
public override bool ExecuteMQ(string serviceName, WQMessage msg) { Log.Write("执行异步的分发方法:" + serviceName + ";msg:" + msg); return true; }
public override bool ExecuteMQ(string serviceName, WQMessage message) { return true; }