I have an Azure function that till now was receiving a classical normal formatted message that another application sent and processed it.
I've discovered MassTransit and wanted to use it in both the ASP.Net application and the Azure Function receiver. But I'm not able to set correctly in the Handler the function to decode and process the message. I've also tried to follow this post but it doesn't seem to to work on 8.x version of MassTransit.
Here's my registration file and the handler
Handler
public class MessageReceiverHandler
{
private readonly ILogger<MessageReceiverHandler> _logger;
private readonly IKlaviyoNameFormSender _klaviyoNameFormSender;
private readonly IConsumer<MyOrderItemFormFilledPayload> _consumer;
public MessageReceiverHandler(ILogger<MessageReceiverHandler> logger, IKlaviyoNameFormSender klaviyoNameFormSender, IConsumer<MyOrderItemFormFilledPayload> consumer)
{
_logger = logger;
_klaviyoNameFormSender = klaviyoNameFormSender;
_consumer = consumer;
}
[Function(nameof(MessageReceiverHandler))]
public async Task Run(
[ServiceBusTrigger("sbq-klaviyo-orderitem-filled-form", Connection = "ServiceBusConnection")]
ServiceBusReceivedMessage message,
ServiceBusMessageActions messageActions)
{
_logger.LogInformation("Message ID: {id}", message.MessageId);
_logger.LogInformation("Message Body: {body}", message.Body);
var orderItem = JsonConvert.DeserializeObject<MessageBody>(message.Body.ToString());
await _klaviyoNameFormSender.SendKlaviyoNameFormSender(orderItem.OrderItemId, default);
await messageActions.CompleteMessageAsync(message);
}
}
Registration
public static IHostBuilder RegisterServices(this IHostBuilder builder)
{
builder.ConfigureServices((context, services) =>
{
services.AddScoped<IKlaviyoNameFormSender, KlaviyoNameFormSender>();
services.AddScoped<ITTGLinq2DbRepository, TTGLinq2DbRepository>();
services.Configure<AzureServiceBusSettings>(context.Configuration.GetSection("AzureServiceBusSettings"));
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
services.Configure<KlaviyoOption>(opt =>
{
[...omiss...]
});
services.AddMassTransit(x =>
{
x.AddConsumer<KlaviyoNameCollectionMessageConsumer>();
x.UsingAzureServiceBus((ctx, cfg) =>
{
var settings = ctx.GetRequiredService<IOptions<AzureServiceBusSettings>>().Value;
cfg.Host(settings.ConnectionString);
cfg.ReceiveEndpoint(settings.QueueName, e =>
{
e.ConfigureConsumer<KlaviyoNameCollectionMessageConsumer>(ctx);
});
});
});
});
return builder;
}
Consumer
public class KlaviyoNameCollectionMessageConsumer
: IConsumer<KlaviyoOrderItemFormFilledPayload>
{
public async Task Consume(ConsumeContext<KlaviyoOrderItemFormFilledPayload> context)
{
return;
//TO IMPLEMENT
}
}
public class KlaviyoOrderItemFormFilledPayload
{
public int OrderItemId { get; set; }
}
Can someone explain to me how to do that? I've read that it should be best to have an app service that runs with a background service listening on the queue, but we have a defined schema with all AzureFunction and I would like to keep the same behavior.
This worked for me. I create a Mass Transit Application by following the reference post you have mentioned.
command:
I have created a service trigger function in
.NET 8 isolatedand used theWorkerandContaractscode in the function.My Directory:
I added the service from
Mass Transitapplication'sProgram.csfile to Function'sProgram.csfile.Program.cs:Worker.cs:Contracts/Welcome.cs:Function1.cs:OUTPUT: