コード例 #1
0
ファイル: SubscriptionClient.cs プロジェクト: gcheney/Burrows
        /// <summary>
        /// Initializes a new instance of the <see cref="SubscriptionClient"/> class.
        /// </summary>
        /// <param name="bus">The bus.</param>
        /// <param name="router">The router.</param>
        /// <param name="subscriptionServiceUri">The subscription service URI.</param>
        /// <param name="startTimeout">The start timeout.</param>
        public SubscriptionClient(IServiceBus bus, ISubscriptionRouter router, Uri subscriptionServiceUri, TimeSpan startTimeout)
        {
            _bus    = bus;
            _router = router;
            _subscriptionServiceUri = subscriptionServiceUri;
            _startTimeout           = startTimeout;
            _network = router.Network;

            if (_log.IsDebugEnabled)
            {
                _log.DebugFormat("Starting SubscriptionClient using {0}", subscriptionServiceUri);
            }

            VerifyClientAndServiceNotOnSameEndpoint(bus);

            _ready.Reset();

            var consumerInstance = new SubscriptionMessageConsumer(_router, _network);

            _unsubscribeAction  = _bus.ControlBus.SubscribeInstance(consumerInstance);
            _unsubscribeAction += _bus.ControlBus.SubscribeContextHandler <SubscriptionRefresh>(Consume);

            _subscriptionEndpoint = _bus.GetEndpoint(subscriptionServiceUri);
            _producer             = new SubscriptionServiceMessageProducer(router, _subscriptionEndpoint);

            WaitForSubscriptionServiceResponse();
        }
コード例 #2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="SubscriptionMessageConsumer"/> class.
 /// </summary>
 /// <param name="router">The router.</param>
 /// <param name="network">The network.</param>
 /// <param name="ignoredSourceAddresses">The ignored source addresses.</param>
 public SubscriptionMessageConsumer(ISubscriptionRouter router, string network, params Uri[] ignoredSourceAddresses)
 {
     _router  = router;
     _peerId  = router.PeerId;
     _peerUri = router.PeerUri;
     _network = network;
     _ignoredSourceAddresses = new HashSet <Uri>(ignoredSourceAddresses);
 }
コード例 #3
0
 public void SetTargetCoordinator(ISubscriptionRouter targetRouter)
 {
     lock (this)
     {
         _targetRouter = targetRouter;
         _waiting.ForEach(x => x(_targetRouter));
         _waiting.Clear();
     }
 }
コード例 #4
0
        /// <summary>
        /// Initializes a new instance of the <see cref="SubscriptionServiceMessageProducer"/> class.
        /// </summary>
        /// <param name="router">The router.</param>
        /// <param name="endpoint">The endpoint.</param>
        public SubscriptionServiceMessageProducer(ISubscriptionRouter router, IEndpoint endpoint)
        {
            _peerId   = router.PeerId;
            _peerUri  = router.PeerUri;
            _network  = router.Network;
            _endpoint = endpoint;

            SendAddPeerMessage();
        }
コード例 #5
0
        public BusSubscriptionMessageProducer(ISubscriptionRouter router, IEndpoint endpoint, Uri endpointUri)
        {
            _peerId      = router.PeerId;
            _peerUri     = router.PeerUri;
            _network     = router.Network;
            _endpoint    = endpoint;
            _endpointUri = endpointUri;
            _timestamp   = DateTime.UtcNow.Ticks;

            SendAddPeerMessage();
        }
コード例 #6
0
        void LoadSubscriptions(ISubscriptionRouter router)
        {
            int messageNumber = 1;

            try
            {
                IEnumerable <PersistentSubscription> existing = _storage.Load(_busUri);

                var knownPeers = new HashSet <Guid>();

                foreach (PersistentSubscription subscription in existing)
                {
                    if (!knownPeers.Contains(subscription.PeerId))
                    {
                        _log.DebugFormat("Loading peer: {0} {1}", subscription.PeerId, subscription.PeerUri);

                        router.Send(new AddPeerMessage
                        {
                            PeerId    = subscription.PeerId,
                            PeerUri   = subscription.PeerUri,
                            Timestamp = subscription.Updated.Ticks,
                        });
                    }

                    _log.DebugFormat("Loading subscription: {0}", subscription);

                    router.Send(new AddPeerSubscriptionMessage
                    {
                        PeerId         = subscription.PeerId,
                        SubscriptionId = subscription.SubscriptionId,
                        EndpointUri    = subscription.EndpointUri,
                        MessageName    = subscription.MessageName,
                        CorrelationId  = subscription.CorrelationId,
                        MessageNumber  = messageNumber++,
                    });
                }
            }
            catch (Exception ex)
            {
                _log.Error("Failed to load existing subscriptions", ex);
            }
        }
コード例 #7
0
        public SubscriptionLoopback(IServiceBus bus, ISubscriptionRouter router)
        {
            _router = router;
            _peerId = NewIds.NewId.NextGuid();

            _waiting = new List <Action <ISubscriptionRouter> >();

            _ignoredMessageTypes = IgnoredMessageTypes();

            WithTarget(x =>
            {
                if (_log.IsDebugEnabled)
                {
                    _log.DebugFormat("Send AddPeer: {0}, {1}", _peerId, bus.ControlBus.Endpoint.Address.Uri);
                }

                x.Send(new AddPeerMessage
                {
                    PeerId    = _peerId,
                    PeerUri   = bus.ControlBus.Endpoint.Address.Uri,
                    Timestamp = DateTime.UtcNow.Ticks,
                });
            });
        }
コード例 #8
0
        public ISubscriptionObserver Create(IServiceBus bus, ISubscriptionRouter router)
        {
            var client = new SubscriptionClient(bus, router, _subscriptionServiceUri, _timeout);

            return(client);
        }
コード例 #9
0
 public void Load(ISubscriptionRouter router)
 {
     _fiber.Add(() => LoadSubscriptions(router));
 }