Ejemplo n.º 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);
        }
Ejemplo n.º 2
0
        public void Send(TransportMessage message, IEnumerable <Peer> peers, SendContext context)
        {
            if (context.PersistentPeerIds.Count != 0)
            {
                throw new ArgumentException("Send invoked with non-empty send context", nameof(context));
            }

            var isMessagePersistent = _messageSendingStrategy.IsMessagePersistent(message);
            var targetPeers         = LoadTargetPeersAndUpdateContext(peers, isMessagePersistent, context);

            var mustBeSendToPersistence = context.PersistentPeerIds.Count != 0;

            context.PersistencePeer = mustBeSendToPersistence ? GetPersistencePeers().FirstOrDefault() : null;

            _innerTransport.Send(message, targetPeers, context);

            if (mustBeSendToPersistence && context.PersistencePeer == null)
            {
                Enqueue(new PersistMessageCommand(message, context.PersistentPeerIds));
            }
        }
Ejemplo n.º 3
0
        public Task <CommandResult> Send(ICommand message, Peer peer)
        {
            if (peer == null)
            {
                throw new ArgumentNullException(nameof(peer));
            }

            if (!IsRunning)
            {
                throw new InvalidOperationException("Unable to send message, the bus is not running");
            }

            var taskCompletionSource = new TaskCompletionSource <CommandResult>();

            if (LocalDispatch.Enabled && peer.Id == PeerId)
            {
                HandleLocalMessage(message, taskCompletionSource);
            }
            else
            {
                var messageId        = MessageId.NextId();
                var transportMessage = ToTransportMessage(message, messageId);

                if (!peer.IsResponding && !_messageSendingStrategy.IsMessagePersistent(transportMessage) && !message.TypeId().IsInfrastructure())
                {
                    throw new InvalidOperationException($"Unable to send this transient message {BusMessageLogger.ToString(message)} while peer {peer.Id} is not responding.");
                }

                _messageIdToTaskCompletionSources.TryAdd(messageId, taskCompletionSource);

                var peers = new[] { peer };
                LogMessageSend(message, transportMessage, peers);
                SendTransportMessage(transportMessage, peers);
            }

            return(taskCompletionSource.Task);
        }