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); }