public IMessageReceiver SelectReceiver(GrpcTransportMessage message) { Receiver selected; do { selected = _current; }while (Interlocked.CompareExchange(ref _current, selected.Next, selected) != selected); return(selected.Current); }
public Task <IMessageReceiver> Next(GrpcTransportMessage message, CancellationToken cancellationToken) { Task <IReceiverLoadBalancer> task = _balancer.Task; if (task.IsCompletedSuccessfully()) { var balancer = task.GetAwaiter().GetResult(); var consumer = balancer.SelectReceiver(message); return(Task.FromResult(consumer)); } async Task <IMessageReceiver> NextAsync() { var balancer = await _balancer.Task.OrCanceled(cancellationToken).ConfigureAwait(false); return(balancer.SelectReceiver(message)); } return(NextAsync()); }
public Task Send(GrpcTransportMessage message, CancellationToken cancellationToken) { var deliveryContext = new GrpcDeliveryContext(message, cancellationToken); return(Deliver(deliveryContext)); }