rebus - Rebus - 从 Handle 方法中退出应用程序
问题描述
我正在使用一个命令/消费者队列实现一个丰富器模式(https://www.enterpriseintegrationpatterns.com/patterns/messaging/DataEnricher.html),其中消费者是丰富器,并将丰富的消息发布到单独的端点(SQL数据库在这种情况下)。消费者作为实现取消令牌的 HostedService 运行。
因为我正在使用来自一个传输的命令并将事件发布到另一个传输,所以我发布到的传输可能已关闭,而我正在使用的传输已启动。在这种情况下,我想记录一个错误并停止我的托管服务。但是,我看不到它是如何工作的,因为调用 Handle 方法的任何方法都已经处理了异常,并且我无法访问我的取消令牌。有没有人有任何想法?
这是我想做的草稿。
public async Task Handle(EditedEventData message)
{
var enricher = _enricherFactory.GetEnricher(message);
object @event = await enricher.EnrichAsync(message);
var transformers = _transformerFactory.GetTransformers(message);
var messages = new List<object>();
foreach (var transformer in transformers)
{
messages.AddRange(transformer.Transform(@event, message));
}
foreach (var item in messages)
{
try
{
await _bus.Publish(item);
}
catch (Exception ex)
{
_logger.LogCritical("Publishing event message {@item} failed with error {ex}", item, ex);
//how do I exit from here?
}
}
}
解决方案
如果我是你,我会想出某种应用程序服务,例如IApplicationControlService
,您可以将其配置为使用您正在使用的任何 IoC 容器注入到您的处理程序中。
它可能看起来像这样:
public interface IApplicationControlService
{
void RequestApplicationShutdown();
}
然后你的代码可以简单地
public class YourHandler : IHandleMessages<EditedEventData>
{
readonly IApplicationControlService applicationControlService;
public YourHandler(IApplicationControlService applicationControlService)
{
this.applicationControlService = applicationControlService;
}
public async Task Handle(EditedEventData message)
{
// (...)
foreach (var item in messages)
{
try
{
await _bus.Publish(item);
}
catch (Exception ex)
{
_logger.LogCritical("Publishing event message {@item} failed with error {ex}", item, ex);
applicationControlService.RequestApplicationShutdown();
}
}
}
}
在发生错误时请求停止应用程序。
的实现IApplicationControlService
可能类似于
public class BruteForceApplicationControlService : IApplicationControlService
{
public void RequestApplicationShutdown()
{
Environment.FailFast("you should probably not do THIS ");
}
}
或更温和的东西——关键是,您将能够提供一种方法来请求您的应用程序“从外部”关闭,很可能是从您的应用程序组装的地方(即“组合根”)
推荐阅读
- angular - Google Place API 为某些地方提供了错误的位置
- javascript - js 来自 array.push(item) 的意外结果
- mysql - 添加外键时出现错误 1215。帮我解决我没有尝试过的问题
- python - 在网格中插入多个画布会使程序崩溃
- c++ - 为什么我的函数名称中随机出现一个额外的字母?
- c# - 我怎样才能对我的所有财产使用“不同”
- angular - 同步使用 Angular fixture.whenStable
- pine-script - 松树脚本的新手,我对链接条件有疑问
- python - 如何使用 pandas 中的第三个布尔列合并数据集中的两列?
- cakephp - 将 TinyMCE 图像上传与 CakePHP 3.8 集成时的 CSRF 问题