Example #1
0
        private async Task ReaderThread(CancellationToken ct)
        {
            while (true)
            {
                ct.ThrowIfCancellationRequested();

                try
                {
                    await _readerSemaphore.WaitAsync(ct);

                    ct.ThrowIfCancellationRequested();

                    _readerStream.Position = 0;
                    var count = await _pipe.CopyMessageToAsync(_readerStream, ct);

                    if (count == 0)
                    {
                        _readerSemaphore.Release();
                        Stop();
                        await StartAsync().ConfigureAwait(false);

                        return;
                    }

                    _readerStream.Position = 0;
                    var request = await _messageSerializer.DeserializeAsync <ApiRequest>(_readerStream).ConfigureAwait(false);

                    if (request == null)
                    {
                        continue;
                    }

                    var requestProcessor = _requestProcessorFactory.Create(request.Resource);
                    var response         = await requestProcessor.ProcessAsync(request.Action, request.Content).ConfigureAwait(false);

                    await Task.Run(() => _pipe.WaitForPipeDrain()).ConfigureAwait(false);

                    await _messageSerializer.SerializeAsync(_pipe, response).ConfigureAwait(false);

                    _readerSemaphore.Release();
                }
                catch (OperationCanceledException)
                {
                    _readerSemaphore.Release();
                    return;
                }
                catch (Exception ex)
                {
                    _logger.Error(ex);
                    _readerSemaphore.Release();
                    Stop();
                    await StartAsync().ConfigureAwait(false);
                }
            }
        }
        public Task ListenAsync(CancellationToken cancellationToken = default)
        {
            if (handlers != null)
            {
                _receiver.OnMessageReceived += async(sender, msg) =>
                {
                    var dsMes = await _serializer.DeserializeAsync(msg);

                    handlers?.Invoke(sender, dsMes);
                };
            }
            return(_receiver.ListenAsync());
        }
        public Task ListenAsync(CancellationToken cancellationToken = default)
        {
            _logger.LogInformation($"rabbit mq subscriber has started listening.");

            if (receivedHandlers != null)
            {
                _transportReceiver.OnMessageReceived += async(sender, msg) =>
                {
                    var message = await _serializer.DeserializeAsync(msg);

                    receivedHandlers?.Invoke(sender, message);
                };
            }

            return(_transportReceiver.ListenAsync(cancellationToken));
        }