NServiceBus Windows-Service:服务不能被停止

本文关键字:不能 服务 Windows-Service NServiceBus | 更新日期: 2023-09-27 18:02:53

我有问题,因为一些时间,我们不能停止NServiceBus Windows-Service。如果我们尝试这样做,我们会得到这个异常:

错误1061:服务此时不能接受控制消息。

不幸的是,我真的没有找到任何关于这件事,但这个Github-Issue: https://github.com/Particular/NServiceBus/issues/1898

遗憾的是,这没有帮助,因为我们实际上需要IConfigureThisEndpoint接口来配置BusConfiguration,它也没有那么长时间运行。我们对其他nservicebus - endpoint也使用了几乎完全相同的模板,它们没有任何问题。

有趣的是,它在这个端点上也工作了很长一段时间,而且它似乎也只是一个特定服务器的问题。

是否有可能从微软或NServiceBus中找到更多关于异常的信息?

NServiceBus Windows-Service:服务不能被停止

安全关机

导致这个错误的原因有很多。NServiceBus将只尝试执行一个优雅的关闭。

NServiceBus不会中止当前正在处理的消息,但会停止处理新消息。

日志文件

日志文件应该表明触发了关机,因此这是您可以验证的第一件事。

我建议将日志级别设置为DEBUG,以帮助诊断关机顺序,并添加以下内容:

var appDomainLogger = LogManager.GetLogger("AppDomain");
var appDomain = AppDomain.CurrentDomain
appDomain.FirstChanceException += (o, ea) => { 
    appDomainLogger.Debug("FirstChanceException", ea.Exception);
};
appDomain.UnhandledException += (o, ea) => { 
    appDomainLogger.Debug("UnhandledException", ea.ExceptionObject as Exception); 
};

可能是发生了阻止关机的异常,这增加了额外的诊断。

长运行消息

例如,如果正在处理的消息正在等待数据库上的锁被释放,那么该消息可能需要比windows服务接口允许的更多的时间。

其他任务,如转换媒体文件

最终,如果所有资源都被释放并且消息已经完成处理,则windows服务应该关闭,除非它们包含阻止关闭的错误。

处理资源

同时,在关闭期间容器也会被处理掉。这可能是因为您的容器具有需要进行大量清理/拆卸的资源。例如,将内存缓存刷新到磁盘或远程存储的资源,以便下次启动服务时可以比正常启动更快。