Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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 })
                );
            }
        }
Example #4
0
        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);
        }