0

I'm trying to use the new IJobConsumer, but the job is never run.

On the project I'm testing this with, Mediator works fine, as well as regular (short-lived) consumers. The only thing that I can't seem to make work is the IJobConsumer. I'm not sure what/if I'm configuring wrong.

This is how I configured MassTransit:

            services.AddMassTransit(x =>
            {
                x.AddServiceClient();

                    x.AddRabbitMqMessageScheduler();

                    x.UsingRabbitMq((context, configurator) =>
                    {
                        configurator.UseRabbitMqMessageScheduler();

                        configurator.Host(options.AzureServiceBusHostOptions.Host);

...
                            var serviceInstanceOptions = new ServiceInstanceOptions()
                                .EnableInstanceEndpoint();

                            configurator.ServiceInstance(serviceInstanceOptions,
                                instanceConfigurator =>
                                {
                                    instanceConfigurator.ConfigureJobServiceEndpoints(serviceConfigurator =>
                                        {
                                            serviceConfigurator.FinalizeCompleted = true;
                                        });

                                    // Extension  method that adds consumers based on my own marker interface
                                    x.AddJobConsumersFromTypeAssembly(consumerType);

                                    instanceConfigurator.ConfigureEndpoints(context);

                                    instanceConfigurator.ReceiveEndpoint("import-products", e =>
                                    {
                                        e.ConfigureConsumer<ImportProductsConsumer>(context, c =>
                                        {
                                             c.Options<JobOptions<IImportProducts>>(o => o
                                                 .SetJobTimeout(TimeSpan.FromMinutes(15))
                                                 .SetConcurrentJobLimit(10));
                                        });
                                    });
                                });


This is the error I get:

[13:43:14 ERR] R-FAULT rabbitmq://localhost/Job eb810000-857f-0205-07d4-08d8c69e2d13 MassTransit.Contracts.JobService.JobSubmitted MassTransit.JobService.Components.StateMachines.JobSaga(00:00:01.0258821)
Automatonymous.NotAcceptedStateMachineException: MassTransit.JobService.Components.StateMachines.JobSaga(eb810000-857f-0205-47ed-08d8c69e2b1a) Saga exception on receipt of MassTransit.Contracts.JobService.JobSubmitted: Not accepted in state AllocatingJobSlot
 ---> Automatonymous.UnhandledEventException: The JobSubmitted event is not handled during the AllocatingJobSlot state for the JobStateMachine state machine
   at Automatonymous.AutomatonymousStateMachine`1.DefaultUnhandledEventCallback(UnhandledEventContext`1 context)
   at Automatonymous.AutomatonymousStateMachine`1.UnhandledEvent(EventContext`1 context, State state)
   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)
   --- End of inner exception stack trace ---
   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)
[13:43:15 WRN] R-RETRY rabbitmq://localhost/Job eb810000-857f-0205-07d4-08d8c69e2d13 MassTransit.Context.RetryConsumeContext<MassTransit.Contracts.JobService.JobSubmitted>
Automatonymous.NotAcceptedStateMachineException: MassTransit.JobService.Components.StateMachines.JobSaga(eb810000-857f-0205-47ed-08d8c69e2b1a) Saga exception on receipt of MassTransit.Contracts.JobService.JobSubmitted: Not accepted in state AllocatingJobSlot
 ---> Automatonymous.UnhandledEventException: The JobSubmitted event is not handled during the AllocatingJobSlot state for the JobStateMachine state machine
   at Automatonymous.AutomatonymousStateMachine`1.DefaultUnhandledEventCallback(UnhandledEventContext`1 context)
   at Automatonymous.AutomatonymousStateMachine`1.UnhandledEvent(EventContext`1 context, State state)
   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)
   --- End of inner exception stack trace ---
   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)
   at MassTransit.Saga.Pipeline.Filters.CorrelatedSagaFilter`2.GreenPipes.IFilter<MassTransit.ConsumeContext<TMessage>>.Send(ConsumeContext`1 context, IPipe`1 next)
   at MassTransit.Pipeline.Filters.InMemoryOutboxFilter`2.Send(TContext context, IPipe`1 next)
   at MassTransit.Pipeline.Filters.InMemoryOutboxFilter`2.Send(TContext context, IPipe`1 next)
   at GreenPipes.Filters.RetryFilter`1.GreenPipes.IFilter<TContext>.Send(TContext context, IPipe`1 next)
[13:43:16 ERR] R-FAULT rabbitmq://localhost/Job eb810000-857f-0205-07d4-08d8c69e2d13 MassTransit.Contracts.JobService.JobSubmitted MassTransit.JobService.Components.StateMachines.JobSaga(00:00:00.3542862)
Automatonymous.NotAcceptedStateMachineException: MassTransit.JobService.Components.StateMachines.JobSaga(eb810000-857f-0205-47ed-08d8c69e2b1a) Saga exception on receipt of MassTransit.Contracts.JobService.JobSubmitted: Not accepted in state WaitingToStart
 ---> Automatonymous.UnhandledEventException: The JobSubmitted event is not handled during the WaitingToStart state for the JobStateMachine state machine
   at Automatonymous.AutomatonymousStateMachine`1.DefaultUnhandledEventCallback(UnhandledEventContext`1 context)
   at Automatonymous.AutomatonymousStateMachine`1.UnhandledEvent(EventContext`1 context, State state)
   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)
   --- End of inner exception stack trace ---
   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)
[13:43:18 ERR] R-FAULT rabbitmq://localhost/Job eb810000-857f-0205-07d4-08d8c69e2d13 MassTransit.Contracts.JobService.JobSubmitted MassTransit.JobService.Components.StateMachines.JobSaga(00:00:00.3506767)
Automatonymous.NotAcceptedStateMachineException: MassTransit.JobService.Components.StateMachines.JobSaga(eb810000-857f-0205-47ed-08d8c69e2b1a) Saga exception on receipt of MassTransit.Contracts.JobService.JobSubmitted: Not accepted in state WaitingToStart
 ---> Automatonymous.UnhandledEventException: The JobSubmitted event is not handled during the WaitingToStart state for the JobStateMachine state machine
   at Automatonymous.AutomatonymousStateMachine`1.DefaultUnhandledEventCallback(UnhandledEventContext`1 context)
   at Automatonymous.AutomatonymousStateMachine`1.UnhandledEvent(EventContext`1 context, State state)
   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)
   --- End of inner exception stack trace ---
   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)
giagiu
  • 19
  • 1

1 Answers1

0

You're configuring two endpoints with the job consumer, so it's duplicating the work.

This method needs to be way up above in the AddMassTransit block, this block is called much later.

// Extension  method that adds consumers based on my own marker interface
x.AddJobConsumersFromTypeAssembly(consumerType);

You should create a consumer definition for your job consumer with the options:

class ImportProductsConsumerDefinition :
    ConsumerDefinition<ImportProductsConsumer>
{
    override Configure(...)
    {
        consumerConfigurator.Options<JobOptions<IImportProducts>>(o => o
                 .SetJobTimeout(TimeSpan.FromMinutes(15))
                 .SetConcurrentJobLimit(10));
    }
}

Then, simplify you bus configuration:

configurator.ServiceInstance(serviceInstanceOptions, instanceConfigurator =>
{
    instanceConfigurator.ConfigureJobServiceEndpoints(serviceConfigurator =>
        {
            serviceConfigurator.FinalizeCompleted = true;
        });

    instanceConfigurator.ConfigureEndpoints(context);
});
Chris Patterson
  • 28,659
  • 3
  • 47
  • 59