MassTransit中间件:相当于Saga的OnMissingInstance,没有自动命名

时间:2018-07-12 04:25:38

标签: middleware masstransit saga automatonymous

我试图通过遵循与在NServiceBus中实现Sagas的方式类似的模式,在不使用自动机状态机(我开始使用但发现很难正确进行单元测试)的情况下手动启动Saga。

但是,我遇到了这样的问题:在初始消息创建实例之前,消息已经达到了传奇,这导致MassTransit静默吞下消息而不会引发异常或将消息移到错误队列。

尽管试图找出解决方案,但很多人建议使用OnMissingInstance来对消息进行故障处理,然后依靠重试框架有效地将其延迟,直到正确地对传奇进行了初始化。 See Here

我想知道是否有一种方法可以不使用Automatonymous框架,最有可能的是利用一些中间件来抢先检查以确保消息存在Saga(引发异常,如果没有则稍后重试)。尝试处理它?如果不是这样,听起来是否有用/有可能吗?

更多信息:

-使用Azure Service Bus
-MongoDB的Saga持久性。

一些代码简化了我要做什么的代码片段:

ec.Saga(new MongoDbSagaRepository<CodeProviderSaga>(sagaDatabase, new MongoDbSagaConsumeContextFactory(), nameof(CodeProviderSaga)), config =>
{
    config.UseApplicationInsights(telemetryClient);
    config.UseRetry(retryConfig => retryConfig.Exponential(10, TimeSpan.FromMilliseconds(500), TimeSpan.FromMinutes(5), TimeSpan.FromSeconds(1)));
});
public class CodeProviderSaga :
    InitiatedBy<FirstEvent>,
    Orchestrates<SecondEvent>,
    IVersionedSaga
{
    [BsonId]
    public Guid CorrelationId { get; set; }
    public int Version { get; set; }
    public bool SecondEventRecieved { get; set; }
    public DateTimeOffset? LastUpdated { get; set; }

    public Task Consume(ConsumeContext<FirstEvent> context)
    {
        this.LastUpdated = DateTimeOffset.UtcNow;
        return Task.Completed;
    }

    // An exception should be thrown if this is received first so it can be retried but it is silently dropped atm
    public Task Consume(ConsumeContext<SecondEvent> context)
    {
        this.SecondEventRecieved = true;
        this.LastUpdated = DateTimeOffset.UtcNow;

        return Task.Completed;
    }
}

1 个答案:

答案 0 :(得分:1)

为解决这个问题,刚刚在commit分支中添加了一个提交,该提交引发了Orchestrates<T>接口中指定的没有匹配传奇的消息的异常。