コード例 #1
0
        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");
            }
        }
コード例 #2
0
ファイル: RequestLogger.cs プロジェクト: dbratus/PingPong
 public void Log(HostStatusMessage hostStatus, bool isSending) =>
 _logger.Trace(() => $"Host status {hostStatus.PendingProcessing}/{hostStatus.InProcessing}/{hostStatus.PendingResponsePropagation} {GetAction(isSending)} {_endPointName}");