private void TrackPublications(ISubscriberCallback subscriber, string subscriberName)
        {
            Logger.LogInfo($"Thread for tracking publications STARTED. Subscriber [{subscriberName}]");
            bool end           = false;
            bool isMessageNull = false;

            while (!end)
            {
                IPublishableMessage message = Subscribers.Instance.GetNextMessage(subscriber, isMessageNull);

                isMessageNull = message == null;

                if (!isMessageNull)
                {
                    try
                    {
                        subscriber.Notify(message);
                        Logger.LogDebug($"Subscriber [{subscriberName}] notified SUCCESSFULLY.");
                    }
                    catch (Exception)
                    {
                        Logger.LogWarn($"Subscriber [{subscriberName}] is no longer in subscriber list.");
                        Subscribers.Instance.RemoveSubscriber(subscriber);
                        Publications.Instance.RemoveSubscriber(subscriber);
                        end = true;
                    }
                }

                Thread.Sleep(200);
            }

            Logger.LogInfo($"Thread for tracking publications STOPPED. Subscriber [{subscriberName}]");
        }
Exemple #2
0
        public string GetSubscriberName(ISubscriberCallback subscriber)
        {
            string subscriberName;

            if (!subscriberNames.TryRemove(subscriber, out subscriberName))
            {
                subscriberName = "FAIELD TO GET A NAME";
            }
            return(subscriberName);
        }
Exemple #3
0
        public void RemoveSubscriber(ISubscriberCallback subscriber)
        {
            bool   success        = subscribers.TryRemove(subscriber, out Queue <IPublishableMessage> queue);
            string subscriberName = GetSubscriberName(subscriber);

            if (success)
            {
                Logger.LogDebug($"Subscriber [{subscriberName}] SUCCESSFYLLY removed from collection of all subscribers.");
            }
            else if (subscribers.ContainsKey(subscriber))
            {
                Logger.LogError($"Try to remove Subscriber [{subscriberName}] FAILED for unknown reason.");
            }
        }
Exemple #4
0
        public void PublishMessage(ISubscriberCallback subscriber, IPublishableMessage message)
        {
            bool   success        = subscribers.TryGetValue(subscriber, out Queue <IPublishableMessage> queueOfMessages);
            string subscriberName = GetSubscriberName(subscriber);

            if (success)
            {
                queueOfMessages.Enqueue(message);
                //TODO: check this log in particular
                Logger.LogDebug($"Published message [{message}] SUCCESSFYLLY enqueued on Subscriber [{subscriberName}]");
            }
            else if (!subscribers.ContainsKey(subscriber))
            {
                Logger.LogWarn($"Subscriber [{subscriberName}, HasCode: {subscriber.GetHashCode()}] does not exist in collection of all subscribers.");
            }
        }
Exemple #5
0
        public void RemoveSubscriber(ISubscriberCallback subscriber)
        {
            string subscriberName = Subscribers.Instance.GetSubscriberName(subscriber);

            foreach (Topic topic in subscribedClients.Keys)
            {
                List <ISubscriberCallback> listOfSubscribers = subscribedClients[topic];

                if (listOfSubscribers.Contains(subscriber))
                {
                    if (listOfSubscribers.Remove(subscriber))
                    {
                        Logger.LogDebug($"Subscriber [] removed from subscribed clients map. [Key Topic: {topic}]");
                    }
                }
            }
        }
Exemple #6
0
        public IPublishableMessage GetNextMessage(ISubscriberCallback subscriber, bool lastMessageWasNull = false)
        {
            IPublishableMessage message = null;

            bool   success        = subscribers.TryGetValue(subscriber, out Queue <IPublishableMessage> queueOfMessages) && queueOfMessages.Count > 0;
            string subscriberName = GetSubscriberName(subscriber);

            if (success)
            {
                if (queueOfMessages.Count > 0)
                {
                    message = queueOfMessages.Dequeue();
                    Logger.LogDebug($"Published message [{message}] SUCCESSFYLLY dequeued from Subscriber's queue of messages [Subscriber name: '{subscriberName}'].");
                }
            }

            return(message);
        }
Exemple #7
0
        public bool TryAddSubscriber(ISubscriberCallback subscriber, string subscriberName)
        {
            bool success = subscribers.TryAdd(subscriber, new Queue <IPublishableMessage>());

            subscriberNames.TryAdd(subscriber, subscriberName);

            if (success)
            {
                Logger.LogDebug($"Subscriber [{subscriberName}] SUCCESSFYLLY added to collection of all subscribers.");
            }
            else if (subscribers.ContainsKey(subscriber))
            {
                Logger.LogWarn($"Subscriber [{subscriberName}, HashCode: {subscriber.GetHashCode()}] already exists in collection of all subscibers.");
            }



            return(success);
        }
        public void Subscribe(Topic topic)
        {
            string subscriberName          = "FAILED TO GET A NAME";
            ISubscriberCallback subscriber = OperationContext.Current.GetCallbackChannel <ISubscriberCallback>();

            try
            {
                subscriberName = subscriber.GetSubscriberName();

                if (Subscribers.Instance.TryAddSubscriber(subscriber, subscriberName))
                {
                    Logger.LogInfo($"Subscriber [{subscriberName}] added to list of all subscribers SUCCESSFULLY.");
                    Thread thread = new Thread(() => TrackPublications(subscriber, subscriberName));
                    thread.Start();
                }
                else
                {
                    Logger.LogDebug($"Failed to add subscriber [{subscriberName}] to list of subscribers.");
                }

                if (Publications.Instance.TryAddSubscriber(topic, subscriber, subscriberName))
                {
                    string message = $"Subscriber [{subscriberName}], added to map Topic -> subscriber SUCCESSFULLY. Topic: '{topic}'.";
                    Logger.LogInfo(message);
                }
                else
                {
                    Logger.LogWarn($"Failed to add subscriber [{subscriberName}] to map Topic -> subscriber. Topic: {topic}");
                }
            }
            catch (Exception ex)
            {
                Logger.LogDebug($"Failed while subscribing. Execption message: {ex.Message}");
                Subscribers.Instance.RemoveSubscriber(subscriber);
            }
        }
Exemple #9
0
        public bool TryAddSubscriber(Topic topic, ISubscriberCallback subscriber, string subscriberName)
        {
            bool success = subscribedClients.TryGetValue(topic, out List <ISubscriberCallback> list);

            if (success)
            {
                list.Add(subscriber);
                Logger.LogDebug($"Subscriber [{subscriberName}] added to subscribed clients map. [Key Topic: {topic}]");
            }
            else if (!subscribedClients.ContainsKey(topic))
            {
                success = subscribedClients.TryAdd(topic, new List <ISubscriberCallback>()
                {
                    subscriber
                });

                if (success)
                {
                    Logger.LogDebug($"Subscriber [{subscriberName}] added to subscribed clients map. [Key Topic: {topic}]");
                }
            }

            return(success);
        }
Exemple #10
0
 public SubscriberProxy(ISubscriberCallback callbackInstance, string endpointName)
     : base(callbackInstance, endpointName)
 {
 }