Изящное завершение работы Rebus - PullRequest
1 голос
/ 13 июля 2020

Я пытаюсь выполнить плавное завершение работы с помощью. NET Core 3.1 и Rebus, однако, когда я пытаюсь ввести Rebus в IHostedService, он перестает регистрировать информацию.

Моя установка выглядит следующим образом

internal class LifetimeEventsHostedService : IHostedService
    {
        private readonly ILoggingAdapter<LifetimeEventsHostedService> _logger;
        private readonly IHostApplicationLifetime _appLifetime;
        private readonly IBus _bus;

        public LifetimeEventsHostedService(
            ILoggingAdapter<LifetimeEventsHostedService> logger,
            IHostApplicationLifetime appLifetime,
            IBus bus)
        {
            _logger = logger;
            _appLifetime = appLifetime;
            _bus = bus;
        }

        public Task StartAsync(CancellationToken cancellationToken)
        {
            _appLifetime.ApplicationStarted.Register(OnStarted);
            _appLifetime.ApplicationStopping.Register(OnStopping);
            _appLifetime.ApplicationStopped.Register(OnStopped);

            return Task.CompletedTask;
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
        }

        private void OnStarted()
        {
            _logger.LogWarning(new LogItem { Message = "Application Started." });
        }

        private void OnStopping()
        {
            _logger.LogInformation(new LogItem { Message = "Application Stopping." });

            _bus.Advanced.Workers.SetNumberOfWorkers(0);
        }

        private void OnStopped()
        {
            _logger.LogInformation(new LogItem { Message = "Application Stopped." });
        }
    }

А потом в моем стартапе у меня

services.AddHostedService<LifetimeEventsHostedService>();

1 Ответ

1 голос
/ 13 июля 2020

Когда вы используете какой-либо из пакетов интеграции Rebus Io C (Rebus.ServiceProvider, Rebus.CastleWindsor, Rebus.Autofa c, et c.), Он автоматически настраивается и закрывается изящно отключается при удалении контейнера.

Итак, если вы хотите, чтобы шина корректно завершала работу, просто убедитесь, что контейнер Io C, в котором он размещен, будет удален при завершении работы вашего приложения.

Это также относится к встроенному адаптеру контейнера (который на самом деле не является контейнером Io C, скорее своего рода фабрикой обработчиков) - просто сделайте это (или что-то подобное):

using (var activator = new BuiltinHandlerActivator())
{
    Configure.With(activator)
        .Transport(...)
        .(...)
        .Start();

    // bus is running now
}

// bus is stopped – all handlers have finished executing

, а затем шина корректно отключится, останавливая операции приема, давая всем обработчикам до 60 секунд (если я правильно помню), чтобы завершить sh все, что они делают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...