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); }
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); }
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); }
public bool PublishSingleDelivery <T>(T message, SingleDeliverySemantic singleDeliverySemantic) where T : class { throw new NotImplementedException(); }