private async Task DoSendWork(CancellationToken cancellationToken) { var isEmptyMessages = await _messageRepository.IsEmpty(cancellationToken); if (isEmptyMessages) { return; } var message = await _messageRepository.GetNext(cancellationToken); if (message != null) { var connections = await _connectionRepository.GetConnectionsByBank(message.Bank, cancellationToken); if (connections.Count == 0) { await _messageRepository.Add(message, cancellationToken); } foreach (var connection in connections) { var channel = GrpcChannel.ForAddress(connection.Address, new GrpcChannelOptions { HttpHandler = _httpHandler }); var client = new Notifier.NotifierClient(channel); var request = new NotifyRequest { Bank = message.Bank, Content = message.Rates }; try { var reply = client.Notify(request); Console.WriteLine($"Notified subscriber {connection.Address} with {message.Rates}. Response: {reply.IsSuccess}"); } catch (RpcException e) { if (e.StatusCode == StatusCode.Internal) { await _connectionRepository.Remove(connection.Address, cancellationToken); } Console.WriteLine($"Details: {e.Status.Detail}"); Console.WriteLine($"Status code: {e.Status.StatusCode}"); } } } }