簡體   English   中英

Masstransit Sagas 和自定義活動的依賴注入問題

[英]Dependency Injection problem with Masstransit Sagas and Custom Activities

我正在為分布式系統實現 Saga。 到目前為止,我在使用 Masstransit 文檔來實現沒有任何有意義行為的 Saga 時沒有遇到任何問題(只是一個帶有幾個微服務交換消息的協調器)。

下一步是在自動 state 機器的 state 更改之間添加一些行為。 我有一個具有所有必需行為的服務,所以我想創建使用依賴注入的服務的海關活動。

問題是活動沒有很好地解決,並引發以下錯誤:

Automatonymous.EventExecutionException: The ArchivosEnviados<ArchivosEnviadosAAlfresco> (Event) execution faulted
 ---> System.MissingMethodException: No parameterless constructor defined for type 'Confuturo.Microservicios.BackendAppSucursalVirtual.Sagas.Activities.EnviarCorreoActivity'.
   at System.RuntimeType.CreateInstanceDefaultCtorSlow(Boolean publicOnly, Boolean wrapExceptions, Boolean fillCache)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, Boolean wrapExceptions)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic, Boolean wrapExceptions)
   at System.Activator.CreateInstance(Type type)
   at Automatonymous.DefaultConstructorStateMachineActivityFactory.GetActivity[TActivity,TInstance](BehaviorContext`1 context)
   at Automatonymous.Activities.ContainerFactoryActivity`2.Automatonymous.Activity<TInstance>.Execute(BehaviorContext`1 context, Behavior`1 next)
   at Automatonymous.Activities.SlimActivity`2.Automatonymous.Activity<TInstance,TData>.Execute(BehaviorContext`2 context, Behavior`2 behavior)
   at Automatonymous.Activities.DataConverterActivity`2.Automatonymous.Activity<TInstance>.Execute[T](BehaviorContext`2 context, Behavior`2 next)
   at Automatonymous.Behaviors.ActivityBehavior`1.Automatonymous.Behavior<TInstance>.Execute[T](BehaviorContext`2 context)
   --- End of inner exception stack trace ---
   at Automatonymous.Behaviors.ExceptionBehavior`2.Automatonymous.Behavior<TInstance,TData>.Faulted[TException](BehaviorExceptionContext`3 context)
   at Automatonymous.Activities.SlimActivity`2.Automatonymous.Activity<TInstance,TData>.Faulted[TException](BehaviorExceptionContext`3 context, Behavior`2 next)
   at Automatonymous.Activities.DataConverterActivity`2.Automatonymous.Activity<TInstance>.Faulted[T,TException](BehaviorExceptionContext`3 context, Behavior`2 next)
   at Automatonymous.Behaviors.LastBehavior`1.Automatonymous.Behavior<TInstance>.Faulted[T,TException](BehaviorExceptionContext`3 context)
   at Automatonymous.Behaviors.DataBehavior`2.Automatonymous.Behavior<TInstance,TData>.Faulted[TException](BehaviorExceptionContext`3 context)
   at Automatonymous.Behaviors.ExceptionTypeCache.CachedConfigurator`1.Automatonymous.Behaviors.ExceptionTypeCache.CachedConfigurator.Faulted[TInstance,TData](Behavior`2 behavior, BehaviorContext`2 context, Exception exception)
   at Automatonymous.Behaviors.ExceptionTypeCache.Faulted[TInstance,TData](Behavior`2 behavior, BehaviorContext`2 context, Exception exception)
   at Automatonymous.Behaviors.ActivityBehavior`1.Automatonymous.Behavior<TInstance>.Execute[T](BehaviorContext`2 context)
   at Automatonymous.States.StateMachineState`1.Automatonymous.State<TInstance>.Raise[T](EventContext`2 context)
   at Automatonymous.States.StateMachineState`1.Automatonymous.State<TInstance>.Raise[T](EventContext`2 context)
   at Automatonymous.AutomatonymousStateMachine`1.Automatonymous.StateMachine<TInstance>.RaiseEvent[T](EventContext`2 context)
   at Automatonymous.Pipeline.StateMachineSagaMessageFilter`2.Send(SagaConsumeContext`2 context, IPipe`1 next)
   at Automatonymous.Pipeline.StateMachineSagaMessageFilter`2.Send(SagaConsumeContext`2 context, IPipe`1 next)
   at MassTransit.Saga.SendSagaPipe`2.Send(SagaRepositoryContext`2 context)
   at MassTransit.Saga.SendSagaPipe`2.Send(SagaRepositoryContext`2 context)
   at MassTransit.Saga.InMemoryRepository.InMemorySagaRepositoryContextFactory`1.Send[T](ConsumeContext`1 context, IPipe`1 next)
   at MassTransit.Saga.Pipeline.Filters.CorrelatedSagaFilter`2.GreenPipes.IFilter<MassTransit.ConsumeContext<TMessage>>.Send(ConsumeContext`1 context, IPipe`1 next) 

文檔沒有明確說明我們應該如何使用 .NET Core 的默認 DI 系統包含自定義活動。 我還在 Stackoverflow、Github repo 和Google Group中查找了這些信息。

在我的 Startup class 中,我按照官方文檔中的說明配置了 Masstransit:

services.AddMassTransit(c =>
            {
                var machineGenerica = new SolicitudGenericStateMachine();
                var repositoryGenerico = new InMemorySagaRepository<SolicitudGenericInstance>();                      

                c.AddConsumer<MensajeDocumentoFirmadoConsumer>();
                c.AddBus(context => Bus.Factory.CreateUsingActiveMq(cfg =>
                {
                    cfg.ReceiveEndpoint("solicitud-generica-saga", e =>
                    {
                        e.StateMachineSaga(machineGenerica, repositoryGenerico);
                    });                       
                    cfg.UseHealthCheck(context);
                    cfg.Host(activeMqOptions.Host, activeMqOptions.Port, hostConfigure =>
                    {
                        hostConfigure.Username(activeMqOptions.Username);
                        hostConfigure.Password(activeMqOptions.Password);
                    });

                    cfg.ReceiveEndpoint(activeMqOptions.EndpointDocumentoFirmado, ep =>
                    {
                        ep.PrefetchCount = 1;
                        ep.Consumer<MensajeDocumentoFirmadoConsumer>(context);
                    });
                }));                
            });
services.AddMassTransitHostedService();               
services.AddScoped<EnviarCorreoActivity>();

如果我理解正確,我必須以某種方式使用IStateMachineActivityFactory但我真的迷失了如何繼續。 任何幫助將不勝感激。

您應該使用以下方法在容器中注冊您的 state 機器:

c.AddSagaStateMachine< SolicitudGenericStateMachine, SolicitudGenericInstance >()
    .InMemoryRepository();

然后,使用以下命令配置 saga:

cfg.ReceiveEndpoint("solicitud-generica-saga", e =>
{
    e.ConfigureSaga<SolicitudGenericInstance>(context);
});  

您注冊為范圍的活動是正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM