首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MassTransit中的Singleton传奇

MassTransit中的Singleton传奇
EN

Stack Overflow用户
提问于 2021-08-18 16:52:27
回答 1查看 238关注 0票数 0

我要做的是只创建一个传奇实例,而不是由后续事件更新。例如,如果我在09:00发送EventACorrelationId等于979158a2-dfa0-45f0-9107-8b8b8028bb9f,那么该事件的传奇在10:00仍然存在,那么如果在10:00发送另一个具有以前发送的CorrelationIdEventA实例,我不希望它覆盖以前的佐贺状态,而是希望MT忽略这个事件。我有点做到了这一点,因为我的传奇状态没有被夸大(只是它的版本增加了),但是问题是MT在新事件到达时抛出了一个错误。例外情况是(+一个上面的日志条目):

代码语言:javascript
复制
[18:41:12 DBG] SAGA:App.Services.Communicators.Amazon.Dispatcher.Api.Sagas.GetOrdersState:0368a723-a819-450f-b6e5-9211d1d6a3a9 Dupe App.Services.Financial.Contracts.GetOrdersCommand
MongoDB.Driver.MongoWriteException: A write operation resulted in an error.
  E11000 duplicate key error collection: Dispatcher.get.orders.states index: _id_ dup key: { _id: BinData(3, 23A7680319A80F45B6E59211D1D6A3A9) }
 ---> MongoDB.Driver.MongoBulkWriteException`1[App.Services.Communicators.Amazon.Dispatcher.Api.Sagas.GetOrdersState]: A bulk write operation resulted in one or more errors.
  E11000 duplicate key error collection: Dispatcher.get.orders.states index: _id_ dup key: { _id: BinData(3, 23A7680319A80F45B6E59211D1D6A3A9) }
   at MongoDB.Driver.MongoCollectionImpl`1.BulkWriteAsync(IClientSessionHandle session, IEnumerable`1 requests, BulkWriteOptions options, CancellationToken cancellationToken)
   at MongoDB.Driver.MongoCollectionImpl`1.UsingImplicitSessionAsync[TResult](Func`2 funcAsync, CancellationToken cancellationToken)
   at MongoDB.Driver.MongoCollectionBase`1.InsertOneAsync(TDocument document, InsertOneOptions options, Func`3 bulkWriteAsync)
   --- End of inner exception stack trace ---
   at MongoDB.Driver.MongoCollectionBase`1.InsertOneAsync(TDocument document, InsertOneOptions options, Func`3 bulkWriteAsync)
   at MassTransit.MongoDbIntegration.Saga.Context.MongoDbSagaRepositoryContext`2.Insert(TSaga instance)

以及佐贺配置的重要部分:

代码语言:javascript
复制
Event(() => GetOrdersIntegrationEventReceived, e =>
    e
        .CorrelateById(x => x.Message.CorrelationId)
        .SelectId(x => x.Message.CorrelationId)
        .SetSagaFactory(ctx => new GetOrdersState
        {
            CorrelationId = ctx.Message.CorrelationId,
            PartnerId = ctx.Message.PartnerId,
            LastUpdatedBeforeFromRequest = ctx.Message.LastUpdatedBefore
        })
        .InsertOnInitial = true);

我想做的事有可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-18 18:19:15

MassTransit将只为每个CorrelationId创建一个传奇实例,因此您的推理是正确的。然而,您的方法有点不合适,可能需要一些调整。

例如,您的事件配置:

代码语言:javascript
复制
Event(() => GetOrdersIntegrationEventReceived, e => e.CorrelateById(x => x.Message.CorrelationId));

这就是为什么在调试日志中看到消息的原因。

然后,在宣布事件之后:

代码语言:javascript
复制
During(Initial, Created,
    When(GetOrdersIntegrationEventReceived)
        .Then(context =>
        {
            context.Instance.PartnerId = context.Message.PartnerId,
            context.Instance.LastUpdatedBeforeFromRequest = context.Message.LastUpdatedBefore
        })
        .TransitionTo(Created)
);

就这样。

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

https://stackoverflow.com/questions/68836424

复制
相关文章

相似问题

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