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