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}]"); }
public string GetSubscriberName(ISubscriberCallback subscriber) { string subscriberName; if (!subscriberNames.TryRemove(subscriber, out subscriberName)) { subscriberName = "FAIELD TO GET A NAME"; } return(subscriberName); }
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."); } }
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."); } }
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}]"); } } } }
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); }
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); } }
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); }
public SubscriberProxy(ISubscriberCallback callbackInstance, string endpointName) : base(callbackInstance, endpointName) { }