azure .NET - MassTransit -所有状态机故障消息

rbl8hiat  于 11个月前  发布在  .NET
关注(0)|答案(1)|浏览(104)

我在masstransit库中有一个关于statmachine的问题。这是我的代码:

public Event<Requested>? Requested { get; }
public Event<Started>? Started { get; }
public Event<ArchiveFinished>? ArchiveFinished { get; }
public Event? Finished { get; }

public Test() {
            InstanceState(x => x.CurrentState);

            Event(() => Requested, x => x.CorrelateById(context => context.Message.RequestId));

            Event(() => Started, x => x.CorrelateById(context => context.Message.RequestId));

            Event(() => ArchiveFinished, x => x.CorrelateById(context => context.Message.RequestId));

            Initially(
                 When(Requested),
                 When(Started),
                 When(ArchiveFinished)
            );

            CompositeEvent(() => Finished,
                x => x.ReadyEventStatus,
                CompositeEventOptions.IncludeInitial,
                Requested,
                Started,
                ArchiveFinished
            );

            DuringAny(
                When(Finished)
                .Publish(context => new Finished() { RequestId = RequestId })
                .Finalize()
            );

            // Error in any of events?

            SetCompletedWhenFinalized();
}

字符串
问题是状态机的工作原理和我一样。但有一件事根本不起作用。如果任何事件中有错误,我可以看到该消息的错误消息。但我需要,当任何给定事件中发生错误时,以某种方式调用错误消息。这可能吗?我尝试了Catch它不起作用。完成错误不起作用。

编辑:

例如,如果正在处理一个请求的消息,并且在一个给定的消费者中发生了错误,则将创建一个新的已删除的错误消息。在那里可以处理所有必要的东西。但是,我仍然需要一些方法来在状态机中对这种情况做出React。创建一个类似于已删除的错误的消息。如果在请求的任何消费者中发生错误/异常,我将需要这个消息,Started或ArchiveFinished消息。希望这样更清楚。

编辑2

public Event<Requested>? Requested { get; }
public Event<Fault<Requested>>? RequestedFault { get; }
public Event<Started>? Started { get; }
public Event<Fault<Started>>? StartedFault { get; }
public Event<ArchiveFinished>? ArchiveFinished { get; }
public Event<Fault<ArchiveFinished>>? ArchiveFinishedFault { get; }
public Event? Finished { get; }

public Test() {
            InstanceState(x => x.CurrentState);

            Event(() => Requested, x => x.CorrelateById(context => context.Message.RequestId));
            Event(() => RequestedFault, x => x.CorrelateById(context => context.Message.Message.RequestId));
            Event(() => Started, x => x.CorrelateById(context => context.Message.RequestId));
            Event(() => StartedFault, x => x.CorrelateById(context => context.Message.Message.RequestId));
            Event(() => ArchiveFinished, x => x.CorrelateById(context => context.Message.RequestId));
            Event(() => ArchiveFinishedFault, x => x.CorrelateById(context => context.Message.Message.RequestId));

            Initially(
                 When(Requested),
                 When(RequestedFault)
                    .Publish(context => new FinishedFault...),
                 When(Started),                 
                 When(StartedFault),                 
                    .Publish(context => new FinishedFault...),
                 When(ArchiveFinished),
                 When(ArchiveFinishedFault),
                    .Publish(context => new FinishedFault...)
            );

            CompositeEvent(() => Finished,
                x => x.ReadyEventStatus,
                CompositeEventOptions.IncludeInitial,
                Requested,
                Started,
                ArchiveFinished
            );

            DuringAny(
                When(Finished)
                .Publish(context => new Finished() { RequestId = RequestId })
                .Finalize()
            );

            // Error in any of events?

            SetCompletedWhenFinalized();
}

kq4fsx7k

kq4fsx7k1#

您可以使用以下命令在状态机中使用故障:

Event<Fault<T>>

字符串
其中T是原始消息类型。

相关问题