返回

Masstransit消费者在.NET 4.8 Topshelf仅在可执行文件中工作,不在服务中

发布时间:2022-04-09 10:52:53 378

我们需要将Masstransit RabbitMQ使用者托管在.NET 4.8 Windows服务。

我们使用依赖注入和Topshelf来运行、安装和启动服务。

将消费者作为Windows*运行.exe工作正常:收到消息。

但从Log4Net日志中可以看出,作为Windows服务启动时,不会收到任何消息。

这是使用Topshelf的Main()方法,通过注入日志和配置来启动MassTransitRunner实例:

    var massTransitRunner = new MassTransitRunner(_logger, _config, args);
    _ = HostFactory.Run(x =>
    {
        x.Service(s =>
                            {
                                s.ConstructUsing(runner => massTransitRunner);
                                s.WhenStarted(runner => runner.Start());
                                s.WhenStopped(runner => runner.Stop());
                            });
        x.RunAsNetworkService();
        x.SetServiceName(nameof(RuleEngineCommandConsumer));
        x.SetDisplayName("_RuleEngine-CommandConsumer");
        x.SetDescription("Processes Commands with Results to trigger Transitions");
    });

这是传递给Topshelf的MassTransitRunner类的Start()方法:

public void Start() {
    try
    {
        _logger.LogInformation("Starting...");

        var hostBuilder = _args.CreateMassTransitHostBuilder(null, null, Program.ConfigureServices, Assembly.GetExecutingAssembly());
        _host = hostBuilder.UseWindowsService().Build();
        _task = _host.StartAsync(_Cancellation.Token);
        //_host.Start();
        //_host.RunAsync(_Cancellation.Token);
        //await _task; => stopped without Starting

        _logger.LogInformation("Started");
    }
    catch (Exception e)
    {
        _logger.LogError(e, "Starting...");
    }
}

正如你所见,我们尝试了不同的方法来启动主机,但只有StartAsync起作用。

完整的示例项目可以在Github中查看

非常感谢您的帮助!

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像