I've a code in which a routing slip is built. A consumer for consuming the completion of each routing slip's activity is built too but this part is never reached.This is the part in which the routing slip is built:
public class UpsertCredentialConsumer : IConsumer<IUpsertCredentialRequest>, IConsumer<RoutingSlipCompleted>, IConsumer<RoutingSlipFaulted>{ private readonly ILogger<UpsertCredentialConsumer> _logger; public UpsertCredentialConsumer(ILogger<UpsertCredentialConsumer> logger) { _logger = logger; } public async Task Consume(ConsumeContext<IUpsertCredentialRequest> context) { var routingSlip = CreateRoutingSlip(context); await context.Execute(routingSlip); } private RoutingSlip CreateRoutingSlip(ConsumeContext<IUpsertCredentialRequest> context) { var builder = new RoutingSlipBuilder(NewId.NextGuid()); builder.SetVariables(new { context.RequestId, context.ResponseAddress }); foreach(var cred in context.Message.AgdtCredential) { //Se credential non presente if (cred.AsIsCredential is null) { //InsertCredential AddInsertCredentialActivity(builder, context.Message, cred.Credential); //InsertExternalRefeCredential builder.AddActivity(XXX.Name, XXX.Queue, new { ... }); } //Se credential presente if (cred.AsIsCredential is not null) { //UpdateCredential AddUpdateCredentialActivity(builder, context.Message, cred.Credential, cred.AsIsCredential); if (!cred.Credential.Status.Equals(cred.AsIsCredential.Status)) { //SetCredentialStatus se lo stato da settare è diverso da quello esistente builder.AddActivity(YYY.Name, YYY.Queue, new { ... }); } } else { //SetCredentialStatus builder.AddActivity(YYY.Name, YYY.Queue, new { ... }); } } builder.AddSubscription(context.ReceiveContext.InputAddress, RoutingSlipEvents.Completed & RoutingSlipEvents.Faulted & RoutingSlipEvents.ActivityCompleted); return builder.Build(); } public async Task Consume(ConsumeContext<RoutingSlipCompleted> context) { _logger.LogTrace("(IUpsertCredentialRequest) Routing Slip Completed: {TrackingNumber}", context.Message.TrackingNumber); var requestId = context.GetVariable<Guid>("RequestId"); var responseAddress = context.GetVariable<Uri>("ResponseAddress"); var responseEndpoint = await context.GetSendEndpoint(responseAddress); await responseEndpoint.Send<IUpsertCredentialResult>( new { Success = true, __RequestId = requestId, Data = context.Message.Variables["credentialId"] }); } public async Task Consume(ConsumeContext<RoutingSlipFaulted> context) { _logger.LogTrace("(IUpsertCredentialRequest) Routing Slip Faulted: {TrackingNumber} {ExceptionInfo}", context.Message.TrackingNumber, context.Message.ActivityExceptions.FirstOrDefault()); var requestId = context.GetVariable<Guid>("RequestId"); var responseAddress = context.GetVariable<Uri>("ResponseAddress"); if (requestId.HasValue && responseAddress != null) { var responseEndpoint = await context.GetSendEndpoint(responseAddress); var validationError = context.Message.Variables.TryGetValue("ErrorCode", out object errorValidation); var exceptions = context.Message.ActivityExceptions.Select(x => x.ExceptionInfo); var errorCode = errorValidation is null ? exceptions.Select(x => x.Message).FirstOrDefault() : ScsExceptions.ScsValidationError.ToString(); _logger.LogTrace("{TrackingNumber} ErrorCode: {error}", context.Message.TrackingNumber, errorCode); await responseEndpoint.Send<IUpsertCredentialResult>( new { Success = false, ErrorCode = errorCode, __RequestId = requestId }); } }
And this is the consumer of RoutingSlipActivityCompleted message:
public class RoutingSlipEventConsumer : IConsumer<RoutingSlipActivityCompleted>, IConsumer<RoutingSlipFaulted>{ private readonly ILogger<RoutingSlipEventConsumer> _logger; public RoutingSlipEventConsumer(ILogger<RoutingSlipEventConsumer> logger) { _logger = logger; } public Task Consume(ConsumeContext<RoutingSlipActivityCompleted> context) { _logger.LogInformation("Routing Slip Activity Completed: {TrackingNumber} {ActivityName}", context.Message.TrackingNumber, context.Message.ActivityName); return Task.CompletedTask; } public Task Consume(ConsumeContext<RoutingSlipFaulted> context) { _logger.LogInformation("Routing Slip Faulted: {TrackingNumber} {ExceptionInfo}", context.Message.TrackingNumber, context.Message.ActivityExceptions.FirstOrDefault()); return Task.CompletedTask; }}
For precision, this is also the code's part in which the consumer are registered:
services.AddMassTransit(x =>{ x.AddConsumer<allTheOtherConsumer>().Endpoint(x=> x.Temporary = true); x.AddConsumer<RoutingSlipEventConsumer>().Endpoint(x => x.Temporary = true); x.UsingRabbitMq((context, cfg) => { cfg.Host(...); cfg.ConfigureEndpoints(context); });});
I'm expecting that the RoutingSlipEventConsumer take the message RoutingSlipActivityCompleted and write the linked informations in the log's file, but it's never happened