private async Task PropagateResponses() { await Task.Yield(); try { while (true) { ResponseQueueEntry nextResponse; try { nextResponse = await _responseChan.ReadAsync(); } catch (ChannelClosedException) { break; } await _messageWriter.Write(nextResponse.Header); if (nextResponse.Body != null) { await _messageWriter.Write(nextResponse.Body); } _requestLogger.Log(nextResponse.Header, nextResponse.Body, true); _counters.PendingResponsePropagation.Decrement(); if ((nextResponse.Header.Flags & ResponseFlags.HostStatus) == ResponseFlags.HostStatus) { var hostStatus = new HostStatusMessage { PendingProcessing = _counters.PendingProcessing.Count, InProcessing = _counters.InProcessing.Count, PendingResponsePropagation = _counters.PendingResponsePropagation.Count }; await _messageWriter.Write(hostStatus); _requestLogger.Log(hostStatus, true); } } await _messageWriter.Write(new ResponseHeader { Priority = MessagePriority.Highest, Flags = ResponseFlags.Termination }); } catch (Exception ex) { _logger.Error(ex, "Response propagator faulted"); } }
public void Log(HostStatusMessage hostStatus, bool isSending) => _logger.Trace(() => $"Host status {hostStatus.PendingProcessing}/{hostStatus.InProcessing}/{hostStatus.PendingResponsePropagation} {GetAction(isSending)} {_endPointName}");