public void Send(TransportMessage message, IEnumerable <Peer> peers, SendContext context) { if (context.PersistedPeerIds.Any()) { throw new ArgumentException("Send invoked with non-empty send context", nameof(context)); } var isMessagePersistent = _messageSendingStrategy.IsMessagePersistent(message); var peerList = (peers as IList <Peer>) ?? peers.ToList(); var upPeers = (peerList.Count == 1 && peerList[0].IsUp) ? peerList : peerList.Where(peer => peer.IsUp).ToList(); context.PersistedPeerIds.AddRange(upPeers.Where(peer => isMessagePersistent && _peerDirectory.IsPersistent(peer.Id)).Select(x => x.Id)); _innerTransport.Send(message, upPeers, context); if (!isMessagePersistent) { return; } var persistentPeerIds = peerList.Where(p => _peerDirectory.IsPersistent(p.Id)).Select(x => x.Id).ToArray(); if (!persistentPeerIds.Any()) { return; } var persistMessageCommand = new PersistMessageCommand(message, persistentPeerIds); EnqueueOrSendToPersistenceService(persistMessageCommand); }
public void Send(TransportMessage message, IEnumerable <Peer> peerIds) { var peerList = (peerIds as IList <Peer>) ?? peerIds.ToList(); var upPeers = (peerList.Count == 1 && peerList[0].IsUp) ? peerList : peerList.Where(peer => peer.IsUp); _innerTransport.Send(message, upPeers); if (!message.MessageTypeId.IsPersistent()) { return; } var persistentPeerIds = peerList.Where(x => _peerDirectory.IsPersistent(x.Id)) .Select(x => x.Id) .ToArray(); if (!persistentPeerIds.Any()) { return; } var persistMessageCommand = new PersistMessageCommand(message, persistentPeerIds); EnqueueOrSendToPersistenceService(persistMessageCommand); }
public void persistent_messages_sent_to_multiple_peers_should_only_be_persisted_for_persistent_ones() { using (MessageId.PauseIdGeneration()) { var message = new FakeEvent(123).ToTransportMessage(Self); var persistCommand = new PersistMessageCommand(message, new[] { AnotherPersistentPeer.Id }).ToTransportMessage(Self); Transport.Send(message, new[] { AnotherPersistentPeer, AnotherNonPersistentPeer }); InnerTransport.ExpectExactly( new TransportMessageSent(message, new[] { AnotherPersistentPeer, AnotherNonPersistentPeer }), new TransportMessageSent(persistCommand, new[] { PersistencePeer }) ); } }
public void Send(TransportMessage message, IEnumerable<Peer> peerIds) { var peerList = (peerIds as IList<Peer>) ?? peerIds.ToList(); var upPeers = (peerList.Count == 1 && peerList[0].IsUp) ? peerList : peerList.Where(peer => peer.IsUp); _innerTransport.Send(message, upPeers); if (!message.MessageTypeId.IsPersistent()) return; var persistentPeerIds = peerList.Where(x => _peerDirectory.IsPersistent(x.Id)) .Select(x => x.Id) .ToArray(); if (!persistentPeerIds.Any()) return; var persistMessageCommand = new PersistMessageCommand(message, persistentPeerIds); EnqueueOrSendToPersistenceService(persistMessageCommand); }