示例#1
0
 private void OnSended(DistributedEventArgs e)
 {
     if (Distributed != null)
     {
         Distributed(this, e);
     }
 }
示例#2
0
        private void Run()
        {
            try
            {
                while (true)
                {
                    if (!IsRuning)
                    {
                        return;
                    }
                    if (IsSleeping)
                    {
                        OnWaked(new EventArgs());
                    }

                    IList<MessageEntity> toDistributes = this.Ontology.MessageProvider.GetTopNCommands(MessageTypeKind.Distribute,
                        this.Ontology, this.Ontology.Ontology.DispatcherLoadCount, "CreateOn", "asc");

                    if (toDistributes == null || toDistributes.Count == 0)
                    {
                        Sleep(new SleepingEventArgs(this.Ontology.Ontology.DispatcherSleepTimeSpan));
                        continue;
                    }
                    else
                    {
                        if (toDistributes.Count <= 0) continue;
                        // 根据ClientID分组命令消息,即把应发送到相同节点的命令消息分在同一组
                        var commandGroups = toDistributes.GroupBy(a => a.ClientId.ToLower());
                        foreach (var g in commandGroups)
                        {
                            foreach (var item in g)
                            {
                                NodeDescriptor responder;
                                _acDomain.NodeHost.Nodes.TryGetNodeById(item.ClientId, out responder);
                                var eArg = new DistributedEventArgs(new DistributeContext(item, responder));
                                OnSending(eArg);
                                MessageRequester.Instance.Request(eArg.Context);
                                var result = eArg.Context.Result;

                                // 处理发送结果
                                int stateCode = result.Status;
                                if (stateCode >= 200 && stateCode < 400)
                                {
                                    SucessCount += 1;
                                }
                                else
                                {
                                    FailCount += 1;
                                    if (stateCode == (int)Status.InternalServerError || stateCode < 200)
                                    {
                                        OnError(new ExceptionEventArgs(
                                            new AnycmdException(
                                                stateCode + result.ReasonPhrase + result.Description))
                                        {
                                            ExceptionHandled = false
                                        });
                                        Sleep(new SleepingEventArgs(this.Ontology.Ontology.DispatcherSleepTimeSpan));
                                    }
                                }
                                eArg.DistributedOn = DateTime.Now;
                                OnSended(eArg);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                OnError(new ExceptionEventArgs(ex) { ExceptionHandled = false });
                throw;
            }
        }
示例#3
0
 private void OnSended(DistributedEventArgs e)
 {
     if (Distributed != null)
     {
         Distributed(this, e);
     }
 }
示例#4
0
        private void Run()
        {
            try
            {
                while (true)
                {
                    if (!IsRuning)
                    {
                        return;
                    }
                    if (IsSleeping)
                    {
                        OnWaked(new EventArgs());
                    }

                    IList <MessageEntity> toDistributes = this.Ontology.MessageProvider.GetTopNCommands(MessageTypeKind.Distribute,
                                                                                                        this.Ontology, this.Ontology.Ontology.DispatcherLoadCount, "CreateOn", "asc");

                    if (toDistributes == null || toDistributes.Count == 0)
                    {
                        Sleep(new SleepingEventArgs(this.Ontology.Ontology.DispatcherSleepTimeSpan));
                        continue;
                    }
                    else
                    {
                        if (toDistributes.Count <= 0)
                        {
                            continue;
                        }
                        // 根据ClientID分组命令消息,即把应发送到相同节点的命令消息分在同一组
                        var commandGroups = toDistributes.GroupBy(a => a.ClientId.ToLower());
                        foreach (var g in commandGroups)
                        {
                            foreach (var item in g)
                            {
                                NodeDescriptor responder;
                                _acDomain.NodeHost.Nodes.TryGetNodeById(item.ClientId, out responder);
                                var eArg = new DistributedEventArgs(new DistributeContext(item, responder));
                                OnSending(eArg);
                                MessageRequester.Instance.Request(eArg.Context);
                                var result = eArg.Context.Result;

                                // 处理发送结果
                                int stateCode = result.Status;
                                if (stateCode >= 200 && stateCode < 400)
                                {
                                    SucessCount += 1;
                                }
                                else
                                {
                                    FailCount += 1;
                                    if (stateCode == (int)Status.InternalServerError || stateCode < 200)
                                    {
                                        OnError(new ExceptionEventArgs(
                                                    new GeneralException(
                                                        stateCode + result.ReasonPhrase + result.Description))
                                        {
                                            ExceptionHandled = false
                                        });
                                        Sleep(new SleepingEventArgs(this.Ontology.Ontology.DispatcherSleepTimeSpan));
                                    }
                                }
                                eArg.DistributedOn = DateTime.Now;
                                OnSended(eArg);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                OnError(new ExceptionEventArgs(ex)
                {
                    ExceptionHandled = false
                });
                throw;
            }
        }