Esempio n. 1
0
 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()));
     }
 }
Esempio n. 2
0
 public override object ExecuteMessageRequest(string serviceName, WQMessage message)
 {
     //1. 按照Key主键更新本地的状态,返回下一个节点的地址
     //2. 判断下一个节点地址去空格后是否和上节点去空格后一致.
     //3. 如果地址不一致,则一请求下一个节点DAC服务
     return message.UserToken;
 }
Esempio n. 3
0
 /// <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);
         }
     }
 }
Esempio n. 4
0
        /// <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);

        }
Esempio n. 5
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;

        }
Esempio n. 6
0
 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;
 }
Esempio n. 7
0
 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);
     }
 }
Esempio n. 8
0
 /// <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);
         }
     }
 }
Esempio n. 9
0
 /// <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);
         }
     }
 } 
Esempio n. 10
0
 /// <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; 
 }
Esempio n. 11
0
 public void SendOneWay(WQMessage msg)
 {
      MessageHandler.Execute(msg.ServiceName, msg, msg.Async);
 }
Esempio n. 12
0
 /// <summary>
 /// 异步根据主题发送自定义消息
 /// </summary>
 /// <param name="topicID"></param>
 /// <param name="msg"></param>
 /// <returns></returns>   
 public bool AsyncRequestMessage(string serviceName, WQMessage msg)
 {
     return MessageHandler.AsyncExecuteMessage(serviceName, msg);
 }
Esempio n. 13
0
 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;
 }
Esempio n. 14
0
 public object Send(WQMessage msg)
 {
     return MessageHandler.Execute(msg.ServiceName, msg, msg.Async);
 }
Esempio n. 15
0
 /// <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;
 }
Esempio n. 16
0
 /// <summary>
 /// 异步根据主题发送自定义消息
 /// </summary>
 /// <param name="topicID"></param>
 /// <param name="msg"></param>
 /// <returns></returns>   
 public bool AsyncRequestMessage(WQMessage msg)
 {
     return MessageHandler.AsyncExecuteMessage(msg.ServiceName, msg);
 }
Esempio n. 17
0
 /// <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);
 }
Esempio n. 18
0
 public override bool ExecuteMQ(string serviceName, WQMessage msg)
 {
     Log.Write("执行异步的分发方法:" + serviceName + ";msg:" + msg);
     return true;
 }
Esempio n. 19
0
 public override bool ExecuteMQ(string serviceName, WQMessage message)
 { 
     return true;
 }