Exemplo n.º 1
0
        public void Consume(IConsumeContext <AddPeer> context)
        {
            // made a new friend, let's introduce ourselves, but may need to send
            // an addclient first, which would loop forever, so how do we only send
            // to people we just met? Observe a PeerAdded event? ;) OnPeerAdded/OnPeerRemoved

            if (_peerUri.Equals(context.SourceAddress))
            {
                return;
            }

            if (context.ResponseAddress == null)
            {
                return;
            }

            List <SubscriptionInformation> subscriptions = _router.LocalSubscriptions
                                                           .Select(x => new SubscriptionInformation(_peerId, x.SubscriptionId, x.MessageName, x.CorrelationId, x.EndpointUri))
                                                           .ToList();

            if (_log.IsInfoEnabled)
            {
                _log.InfoFormat("Sending {0} subscriptions to {1} from {2}", subscriptions.Count, context.SourceAddress, _peerUri);
            }

            IEndpoint clientEndpoint = _subscriptionBus.GetEndpoint(context.ResponseAddress);

            var addPeer = new AddPeerMessage
            {
                PeerId    = _peerId,
                PeerUri   = _peerUri,
                Timestamp = _producer.Timestamp,
            };

            clientEndpoint.Send(addPeer, sendContext =>
            {
                sendContext.SetNetwork(_network);
                sendContext.SetSourceAddress(_peerUri);
            });

            subscriptions.Each(x =>
            {
                var add = new AddPeerSubscriptionMessage
                {
                    PeerId         = _peerId,
                    MessageNumber  = 0,
                    SubscriptionId = x.SubscriptionId,
                    EndpointUri    = x.EndpointUri,
                    MessageName    = x.MessageName,
                    CorrelationId  = x.CorrelationId,
                };

                clientEndpoint.Send(add, sendContext =>
                {
                    sendContext.SetNetwork(_network);
                    sendContext.SetSourceAddress(_peerUri);
                });
            });
        }
        public void OnSubscriptionAdded(SubscriptionAdded message)
        {
            long messageNumber = Interlocked.Increment(ref _lastMessageNumber);

            var add = new AddPeerSubscriptionMessage
            {
                PeerId         = _peerId,
                MessageNumber  = messageNumber,
                SubscriptionId = message.SubscriptionId,
                EndpointUri    = message.EndpointUri,
                MessageName    = message.MessageName,
                CorrelationId  = message.CorrelationId,
            };

            if (_log.IsDebugEnabled)
            {
                _log.DebugFormat("AddSubscription: {0}, {1}", add.MessageName, add.SubscriptionId);
            }

            _endpoint.Send(add, SetSendContext);
        }