首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rebus正常关闭

Rebus正常关闭
EN

Stack Overflow用户
提问于 2020-07-13 23:11:16
回答 1查看 123关注 0票数 2

我正在尝试使用Rebus Core3.1和.NET执行正常关闭,但是当我试图在IHostedService中注入Rebus时,它会停止记录信息。

我的设置如下

代码语言:javascript
复制
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." });
        }
    }

在我的初创公司里,我有

代码语言:javascript
复制
services.AddHostedService<LifetimeEventsHostedService>();
EN

回答 1

Stack Overflow用户

发布于 2020-07-14 01:05:46

当您使用任何Rebus的IoC集成包(Rebus.ServiceProvider、Rebus.CastleWindsor、Rebus.Autofac等)时,它将自动设置自身,以便在容器被释放时正常关闭。

因此,如果您希望总线正常关闭,只需确保它所在的IoC容器在应用程序关闭时得到释放。

这也适用于内置容器适配器(它实际上不是IoC容器,更像是某种处理程序工厂)-只需执行以下操作(或类似的操作):

代码语言:javascript
复制
using (var activator = new BuiltinHandlerActivator())
{
    Configure.With(activator)
        .Transport(...)
        .(...)
        .Start();

    // bus is running now
}

// bus is stopped – all handlers have finished executing

然后总线将优雅地关闭,停止接收操作,给所有处理程序最多60秒(如果我没记错的话)来完成它们正在做的任何事情。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62878788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档