예제 #1
0
        private UnsubscribeAction SendAddSubscription(SubscriptionInformation info)
        {
            if (_ignoredSubscriptions.Contains(info.MessageName))
            {
                return(() => true);
            }

            var add = new AddSubscription(info);

            ClientSubscriptionInformation clientInfo = _mapper.Transform(info);

            if (clientInfo.Unsubscribe == null)
            {
                clientInfo.Unsubscribe = () => true;
            }

            lock (_subscriptions)
            {
                _subscriptions.Add(clientInfo.SubscriptionId, clientInfo);
            }

            _subscriptionServiceEndpoint.Send(add);
            return(() =>
            {
                var remove = new RemoveSubscription(info, _sequence.Next());

                _subscriptionServiceEndpoint.Send(remove);

                return true;
            });
        }
예제 #2
0
        private void Remove(SubscriptionInformation subscription)
        {
            if (!_subscriptions.Contains(subscription.SubscriptionId))
            {
                return;
            }

            _log.Debug("SubscriptionClient Remove: " + subscription);

            lock (_subscriptions)
            {
                if (!_subscriptions.Contains(subscription.SubscriptionId))
                {
                    return;
                }

                ClientSubscriptionInformation subscriptionInformation = _subscriptions[subscription.SubscriptionId];

                try
                {
                    subscriptionInformation.Unsubscribe();
                }
                catch (Exception ex)
                {
                    _log.Error("Error removing a subscription (object may have been disposed)", ex);
                }

                _subscriptions.Remove(subscriptionInformation.SubscriptionId);
            }
        }
예제 #3
0
        private void Add(SubscriptionInformation sub)
        {
            if (IgnoreIfLocalEndpoint(sub.EndpointUri))
            {
                return;
            }

            _log.Debug("SubscriptionClient Add: " + sub);

            Type messageType = Type.GetType(sub.MessageName);

            if (messageType == null)
            {
                _log.InfoFormat("Unknown message type {0}, unable to add subscription", sub.MessageName);
                return;
            }

            lock (_subscriptions)
            {
                if (_subscriptions.Contains(sub.SubscriptionId))
                {
                    return;
                }

                ClientSubscriptionInformation clientInfo = _mapper.Transform(sub);

                UnsubscribeAction unsubscribe;

                Type correlatedByType = GetCorrelatedByType(sub.CorrelationId, messageType);
                if (correlatedByType != null)
                {
                    unsubscribe = AddCorrelationSubscription(correlatedByType, sub.CorrelationId, messageType, sub.EndpointUri);
                }
                else
                {
                    unsubscribe = (UnsubscribeAction)GetType()
                                  .GetMethod("AddToClients", _bindingFlags)
                                  .MakeGenericMethod(messageType).Invoke(this, new[] { sub.EndpointUri });
                }

                clientInfo.Unsubscribe = unsubscribe;

                _subscriptions[sub.SubscriptionId] = clientInfo;
            }
        }