コード例 #1
0
ファイル: EventAggregator.cs プロジェクト: orb1t/Nomad
        public bool PublishSingleDelivery <T>(T message, SingleDeliverySemantic singleDeliverySemantic) where T : class
        {
            // TODO: make the algorithm into single delivery be injectable
            Type type = typeof(T);
            HashSet <IEventAggregatorTicket> tickets;

            lock (_subscriptions)
            {
                _subscriptions.TryGetValue(type, out tickets);
            }

            //prevention from throwing exception
            if (tickets == null)
            {
                return(false);
            }

            List <IEventAggregatorTicket> ticketsList;

            lock (tickets)
            {
                ticketsList = new List <IEventAggregatorTicket>(tickets);
            }

            if (ticketsList.Count > 0)
            {
                ticketsList.First().Execute(message);
            }

            return(true);
        }
コード例 #2
0
        public bool PublishSingleDelivery <T>(T message, SingleDeliverySemantic singleDeliverySemantic) where T : class
        {
            bool localDelivery = _localEventAggregator.PublishSingleDelivery(message, singleDeliverySemantic);

            if (localDelivery)
            {
                return(true);
            }

            // prepare for publishing remotely
            byte[]         bytes;
            TypeDescriptor descriptor;

            try
            {
                PackData(message, out bytes, out descriptor);
            }
            catch (Exception e)
            {
                // we return false because the delivery is not possible at all in any semantics
                logger.Warn("Could not preapre message for sending", e);
                return(false);
            }

            bool remoteDelivery = _singleDelivery.SentSingle(RemoteDistributedEventAggregator, bytes, descriptor,
                                                             singleDeliverySemantic);

            return(remoteDelivery);
        }
コード例 #3
0
        public bool SentSingle(IEnumerable <IDistributedEventAggregator> eventAggregators, byte[] messageContent,
                               TypeDescriptor descriptor, SingleDeliverySemantic delivery)
        {
            // FIXME: this code is wrong from the performance point of view
            Logger = LogManager.GetLogger(NomadConstants.NOMAD_LOGGER_REPOSITORY, typeof(BasicSingleDeliverySubsystem));

            var deaWithSubscribers = new List <IDistributedEventAggregator>();

            // at fist send to the other deas the is subscrbed
            // NOTE: this phase can be parallelized
            foreach (IDistributedEventAggregator dea in eventAggregators)
            {
                try
                {
                    if (dea.IsSubscriberForType(descriptor))
                    {
                        deaWithSubscribers.Add(dea);
                    }
                }
                catch (Exception e)
                {
                    // do nothing except for logging such exception
                    Logger.Warn("Exception during sending IsSubscrier", e);
                }
            }

            if (deaWithSubscribers.Count == 0)
            {
                // no message can be delivered caouse no one waits for it
                return(false);
            }

            // deliver the messages using this version
            foreach (IDistributedEventAggregator dea in deaWithSubscribers)
            {
                try
                {
                    bool result = dea.OnPublishSingleDelivery(messageContent, descriptor);
                    if (result)
                    {
                        // the message was delivered so happy day scenario (yay)
                        return(true);
                    }
                }
                catch (Exception e)
                {
                    Logger.Warn("Exception during sending OnPublish phase", e);

                    // there was message delivery problem
                    if (delivery == SingleDeliverySemantic.AtLeastOnce)
                    {
                        continue;
                    }
                    else if (delivery == SingleDeliverySemantic.AtMostOnce)
                    {
                        return(true);
                    }
                    else
                    {
                        throw new InvalidOperationException("Semantic of delivery is not known", e);
                    }
                }
            }

            // nothing succeeded
            return(false);
        }
コード例 #4
0
 public bool PublishSingleDelivery <T>(T message, SingleDeliverySemantic singleDeliverySemantic) where T : class
 {
     throw new NotImplementedException();
 }