コード例 #1
0
        public async Task StartAsync(RabbitMQProtocolReader reader, IConnectionHandler connection, IChannelHandler channel, CancellationToken token = default)
        {
            _connectionHandler = connection;
            _channelHandler    = channel;
            var headerReader = new FrameHeaderReader();

            _isClosed = false;
            //while (true)
            while (!_isClosed)
            {
                var result = await reader.ReadAsync(headerReader, token).ConfigureAwait(false);

                switch (result.FrameType)
                {
                case RabbitMQConstants.FrameMethod:
                {
                    var method = await reader.ReadAsync(_methodHeaderReader, token).ConfigureAwait(false);
                    await ProcessMethod(reader, ref result, ref method, token).ConfigureAwait(false);

                    break;
                }

                case RabbitMQConstants.FrameHeartbeat:
                {
                    await reader.ReadNoPayloadAsync(token).ConfigureAwait(false);

                    await _connectionHandler.OnHeartbeatAsync().ConfigureAwait(false);

                    break;
                }

                default:
                {
                    throw new RabbitMQFrameException(result.FrameType);
                }
                }
            }
        }
コード例 #2
0
        private async Task StartReading()
        {
            var headerReader = new FrameHeaderReader();

            try
            {
                while (true)
                {
                    var result = await _protocol.Reader.ReadAsync(headerReader, _cts.Token).ConfigureAwait(false);

                    _protocol.Reader.Advance();
                    if (result.IsCompleted)
                    {
                        break;
                    }
                    var header = result.Message;
                    // Debug.WriteLine($"{header.FrameType} {header.Channel} {header.PaylodaSize}");
                    switch (header.FrameType)
                    {
                    case 1:
                    {
                        if (header.Channel == 0)
                        {
                            await Channel0.HandleAsync(header).ConfigureAwait(false);

                            break;
                        }
                        await ProcessChannels(header).ConfigureAwait(false);

                        break;
                    }

                    case 2:
                    {
                        await ProcessChannels(header).ConfigureAwait(false);

                        break;
                    }

                    case 8:
                    {
                        await _protocol.Reader.ReadAsync(new NoPayloadReader()).ConfigureAwait(false);

                        _protocol.Reader.Advance();
                        await _protocol.Writer.WriteAsync(new HeartbeatWriter(), false).ConfigureAwait(false);

                        break;
                    }


                    default: throw new Exception($"Frame type missmatch:{header.FrameType}, {header.Channel}, {header.PaylodaSize}");
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine(e.StackTrace);
                _context.Abort();
                _cts.Cancel();
                _endReading.SetResult(false);
            }
        }