.Net-Core 2.2 MassTransit.ConfigurationException: конечный автомат не был должным образом настроен - PullRequest
0 голосов
/ 21 сентября 2019

Вопрос новичка - что мне не хватает?Имеются ли какие-либо примеры Saga для dotnetcore 2.2?

У меня есть базовая сквозная система, работающая нормально с сообщениями, проходящими через контейнеры в docker-compose, но добавление Saga кажется сложной задачей -

Q.Я пропускаю зависимость планировщика?В MassTransit 5.5.5, cfg.UseInMemoryMessageScheduler ();не компилируется.

Что-то странное происходило, мне пришлось явно пометить свой конечный автомат как ISaga

MassTransit.ConfigurationException: не удалось создать соединитель конечного автомата для Model.WorkflowExecutionStateMachine --> MassTransit.ConfigurationException: конечный автомат не был должным образом настроен: workflowapi_1 |[Сбой] ExecutingTask не был указан


    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

        // Register MassTransit
        services.AddMassTransit(x =>
        {
            x.AddConsumer<WorkflowTaskConsumer>();

            // required?
            x.AddSaga<WorkflowExecutionSaga>();

            x.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(cfg =>
            {
                var rabbitMQHostName = $"rabbitmq://{configuration["RabbitMQHostName"]}";

                Console.Out.WriteLineAsync($"Starting Workflow Receiver... {rabbitMQHostName}/{QueueNames.ExeuteWorkflowTaskQueue}");

                var host = cfg.Host(new Uri(rabbitMQHostName), hostConfig =>
                {
                    hostConfig.Username("guest");
                    hostConfig.Password("guest");
                });

                // A basic message works OK
                cfg.ReceiveEndpoint(host, QueueNames.ExeuteWorkflowTaskQueue, ep =>
                {
                    ep.PrefetchCount = 1;
                    ep.UseMessageRetry(mr => mr.Interval(1000, 2));
                    ep.ConfigureConsumer<WorkflowTaskConsumer>(provider);
                });

                // Doesn't like this
                cfg.ReceiveEndpoint(host, QueueNames.WorkflowStateMachineSagaQueueName, ep =>
                {
                    ep.PrefetchCount = 1;
                    ep.UseMessageRetry(mr => mr.Interval(1000, 2));
                    ep.StateMachineSaga(new WorkflowExecutionSaga(), new InMemorySagaRepository<WorkflowExecutionStateMachine>());
                });
            }));

            cfg.UseInMemoryMessageScheduler(); // doesn't compile!
        });
    }

Шина запускается следующим образом -


    public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime lifetime)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            // The default HSTS value is 30 days. You may want to change this for production scenarios, 
            // see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }

        app.UseMvc();

        var bus = app.ApplicationServices.GetService<IBusControl>();
        var busHandle = TaskUtil.Await(() =>
        {
            return bus.StartAsync();
        });

        lifetime.ApplicationStopping.Register(() =>
        {
            busHandle.Stop();
        });
    }

Сведения об исключении

Необработанное исключение: MassTransit.ConfigurationException: Не удалось создатьсоединитель конечного автомата для Rapid.Workflow.Api.Model.WorkflowExecutionStateMachine ---> MassTransit.ConfigurationException: конечный автомат не был правильно настроен: workflowapi_1 |[Сбой] В ExecutingTask не было указано workflowapi_1 |at Automatonymous.StateMachineConfigurationResult.CompileResults (IEnumerable 1 results) workflowapi_1 | at Automatonymous.StateMachineConnectors.StateMachineConnector 1.StateMachineEvents () + MoveNext () workflowapi_1 | at System.Collections.Generic.List 1.AddEnumerable(IEnumerable 1 перечислимый) workflowapi_1 |at System.Linq.Enumerable.ToList [TSource] (IEnumerable 1 source) workflowapi_1 | at Automatonymous.StateMachineConnectors.StateMachineConnector 1..ctor (SagaStateMachine 1 stateMachine) workflowapi_1 | --- End of inner exception stack trace --- workflowapi_1 | at Automatonymous.StateMachineConnectors.StateMachineConnector 1..ctor (SagaStateMachine 1 stateMachine) workflowapi_1 | at Automatonymous.SagaConfigurators.StateMachineSagaConfigurator 1..ctor (SagaStateMachine 1 stateMachine, ISagaRepository 1 хранилище, наблюдатель ISagaConfigurationObserver_1)| в MassTransit.AutomatonymousReceiveEndpointExtensions.StateMachineSaga [TInstance] (конфигуратор IReceiveEndpointConfigurator, хранилище SagaStateMachine 1 stateMachine, ISagaRepository 1, настройка Action`1) workflowapi_1 | в Rapid.Workflow.Workflow.Api / Startup.cs: строка 74

Зависимости

<PackageReference Include="Automatonymous" Version="4.1.6" />
<PackageReference Include="MassTransit" Version="5.5.5" />
<PackageReference Include="MassTransit.RabbitMQ" Version="5.5.5" />
<PackageReference Include="MassTransit.AspNetCore" Version="5.5.5" />
<PackageReference Include="MassTransit.Automatonymous" Version="5.5.5" /> 
<PackageReference Include="MassTransit.Extensions.DependencyInjection" Version="5.5.5" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />

Спасибо за любые советы или идеи -

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

Вам нужно изменить, используя метод .AddStateMachineSaga вместо метода .AddSaga, который вы используете в рассматриваемом коде.

// required? - yes, but should be as shown here
x.AddSagaStateMachine<WorkflowExecutionSaga, WorkflowState>();

В этом случае и конечный автомат, итребуется тип экземпляра конечного автомата.Затем в своей конечной точке используйте:

ep.ConfigureSaga<WorkflowState>(provider);

Также необходимо убедиться, что в контейнере настроен репозиторий саг, что выполняется для MS DI / in-memory с помощью:

x.AddSingleton<ISagaRepository<WorkflowState>, InMemorySagaRepository<WorkflowState>>();

Это должно заставить вас двигаться, если ваш конечный автомат не сломан.Если вы по-прежнему получаете сообщение об ошибке, убедитесь, что все события конечного автомата и т. Д. Правильно настроены.

Кроме того, ваш экземпляр конечного автомата должен реализовать:

public class WorkflowState :
    SagaStateMachineInstance

И ваш конечный автомат выполняет не необходимо реализовать ISaga.

public class WorkflowExecutionSaga :
    MassTransitStateMachine<WorkflowState>
0 голосов
/ 21 сентября 2019

Эта ошибка, похоже, возникает, потому что класс Saga объявил некоторые пока неиспользованные (но общедоступные) события - DOH!

Решением было удаление неиспользуемых событий из Saga ...

// uncomment will fail! public Event<ISatelliteTaskRequest> UnusedEvent { get; private set; }

Посмотрев на этот образец https://github.com/selcukusta/masstransit-saga-implementation и вернув мои program.cs обратно к основам, я все еще получал ошибку!Таким образом, не проблема контейнера / IOC / запуска.

Далее, ища в источнике сообщение об ошибке MassTransit (https://github.com/MassTransit/MassTransit/blob/master/src/MassTransit.AutomatonymousIntegration/Configuration/StateMachineConnectors/StateMachineConnector.cs) Я понял, что коррелирующий код, возможно, отражается на всех открытых членах Saga -

Итак, удаление неиспользованногособытия из класса Saga исправляют проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...