Beispiel #1
0
        public bool PublishDistributed <T>(string topic, T eventMessage, DistributedConsumerType distributedConsumerType, string lable = "")
        {
            if (!SubscriptionManager.DistributedEventService.IsRunning)
            {
                throw new EventException("分布式事件处理服务未启动");
            }
            WriteTrackLog("发布分布式事件通知", topic, lable, eventMessage);

            //WriteTrackLog("发布分布式事件通知,本地通知开始", topic, lable, eventMessage);
            var subscriptions = _subscriptionService.GetSubscriptions <T>();

            subscriptions.ToList().ForEach(x => PublishToConsumer(x, lable, eventMessage));
            //WriteTrackLog("发布分布式事件通知,本地通知完成", topic, lable, eventMessage);

            var consumerType = typeof(T);
            var objectName   = consumerType.FullName;
            DistributedObjectNameAttribute objectNameAttr = consumerType.GetCustomAttribute <DistributedObjectNameAttribute>();

            if (objectNameAttr != null && !string.IsNullOrEmpty(objectNameAttr.Name))
            {
                objectName = objectNameAttr.Name;
            }
            var dEvent = new DistributedEvent(eventMessage, topic, lable, objectName);

            //WriteTrackLog(string.Format("发布分布式事件通知,请求远程通信开始,对象名:{0}", objectName), topic, lable, eventMessage);
            return(SubscriptionManager.EventTransport.SendEventMessage(dEvent, distributedConsumerType));
        }
Beispiel #2
0
 public bool SendEventMessage(DistributedEvent dEvent, DistributedConsumerType consumerType)
 {
     try
     {
         bool hasError = false;
         var  list     = GetConsumerAddress(dEvent.Topic);
         if (list.Count() == 0)
         {
             EventPublisher.WriteTrackLog(string.Format("发布分布式事件通知,没有检测到任何分布式订阅对象,通知已退出,对象名:{0}", dEvent.ObjectName), dEvent.Topic, dEvent.Lable, dEvent.GetValue());
             return(true);
         }
         foreach (var item in list)
         {
             bool flag    = false;
             var  address = string.Format("{0}:{1}", GetIntranetIp(), this._port);
             if (item == address)
             {
                 continue;
             }
             EventPublisher.WriteTrackLog(string.Format("发布分布式事件通知,请求远程通信,地址:{0},对象名:{1}", item, dEvent.ObjectName), dEvent.Topic, dEvent.Lable, dEvent.GetValue());
             flag = SendEventMessage(dEvent, item);
             if (flag)
             {
                 EventPublisher.WriteTrackLog(string.Format("发布分布式事件通知,请求远程通信完成,地址:{0},对象名:{1}", address, dEvent.ObjectName), dEvent.Topic, dEvent.Lable, dEvent.GetValue());
                 if (consumerType == DistributedConsumerType.OnlyOne)
                 {
                     break;
                 }
             }
             else
             {
                 hasError = true;
             }
         }
         EventPublisher.WriteTrackLog(string.Format("发布分布式事件通知,请求远程通信完成,对象名:{0}", dEvent.ObjectName), dEvent.Topic, dEvent.Lable, dEvent.GetValue());
         return(hasError == true ? false : true);
     }
     catch (Exception ex)
     {
         EventPublisher.WriteTrackLog(string.Format("发布分布式事件通知,请求远程通信错误,对象名:{0}", dEvent.ObjectName), dEvent.Topic, dEvent.Lable, dEvent.GetValue(), ex);
     }
     return(false);
 }
Beispiel #3
0
        private bool SendEventMessage(DistributedEvent dEvent, string address)
        {
            int index = 0;

            while (index <= 2)
            {
                var publisherStatus = GetEventPublisher(dEvent.Topic, address);
                if (publisherStatus.ErrorCount > 2)
                {
                    if (RemoveEventPublisher(dEvent.Topic, address))
                    {
                        publisherStatus = GetEventPublisher(dEvent.Topic, address);
                    }
                }
                try
                {
                    publisherStatus.EventPublisher.Process(dEvent);
                    return(true);
                }
                catch (EndpointNotFoundException)
                {
                    if (!sourceArrays.IsAddingCompleted)
                    {
                        sourceArrays.Add(new ClearRegisteredConsumer {
                            Topic = dEvent.Topic, Address = address
                        });
                    }
                    return(false);
                }
                catch (Exception ex)
                {
                    publisherStatus.Error();
                    EventPublisher.WriteTrackLog(string.Format("发布分布式事件通知,请求远程通信错误,地址:{0},对象名:{1},重试第{2}次", address, dEvent.ObjectName, index + 1), dEvent.Topic, dEvent.Lable, dEvent.GetValue(), ex);
                }
                index++;
            }

            return(false);
        }
        public void Process(DistributedEvent dEvent)
        {
            string address      = string.Empty;
            Type   type         = null;
            object eventMessage = null;

            try
            {
                address      = SubscriptionManager.EventTransport.GetEventServerAddress();
                type         = _subscriptionService.GetTopicConsumerType(dEvent.Topic, dEvent.ObjectName);
                eventMessage = dEvent.GetValue(type);
                if (!_subscriptionService.HasTopicConsumer(dEvent.Topic))
                {
                    EventPublisher.WriteTrackLog(string.Format("发布分布式事件通知,执行请求远程通信,主题不存在,地址:{0},对象名:{1}", address, dEvent.ObjectName), dEvent.Topic, dEvent.Lable, eventMessage);
                    return;
                }
            }
            catch (Exception ex)
            {
                _logger.Error("获取事件对象类型错误", ex);
                EventPublisher.WriteTrackLog(string.Format("发布分布式事件通知,准备执行请求远程通信错误,地址:{0},对象名:{1}", address, dEvent.ObjectName), dEvent.Topic, dEvent.Lable, dEvent, ex);
                return;
            }
            EventPublisher.WriteTrackLog(string.Format("发布分布式事件通知,执行请求远程通信,地址:{0},对象名:{1}", address, dEvent.ObjectName), dEvent.Topic, dEvent.Lable, eventMessage);
            try
            {
                EventPublisher.WriteTrackLog(string.Format("发布分布式事件通知,本地通知开始,地址:{0},对象名:{1}", address, dEvent.ObjectName), dEvent.Topic, dEvent.Lable, eventMessage);
                var subscriptions = _subscriptionService.GetDistributedSubscriptions(dEvent.Topic, dEvent.ObjectName);
                subscriptions.ToList().ForEach(x => PublishToConsumer(address, dEvent.ObjectName, dEvent.Topic, x.Consumer, x.HandleType, eventMessage, dEvent.Lable));
                EventPublisher.WriteTrackLog(string.Format("发布分布式事件通知,本地通知完成,地址:{0},对象名:{1}", address, dEvent.ObjectName), dEvent.Topic, dEvent.Lable, eventMessage);
            }
            catch (Exception ex)
            {
                _logger.Error(string.Format("获取订阅对象错误,主题:{0},对象名称:{1},数据:{2}", dEvent.Topic, dEvent.ObjectName, dEvent.GetJsonString()), ex);
            }
        }