I am creating a RestApi in asp.net core, and in one of my services, I publish a message to RabbitMQ using RawRabbit. That being said, I see the message is published in the RabbitMQ control panel when I have commented the subscriber part, and the number of consumers is 0, when I add the subscriber part number of consumers become 1 and the messages are getting consumed so there is no message in the control panel, BUT what is weird is that none of the codes ( in this case it's just a log ) in the subscriber does not run.
Publisher part:
public async void RaiseAsync(string event_name, ShoppingCartItemAdded data) {
const string EXCHANGE_NAME = "myRabbit";
Action<IPublishContext> x = (ctx) => ctx.UsePublishConfiguration(xfg => xfg.OnExchange(EXCHANGE_NAME));//.WithRoutingKey("shoppingcartitemadded"));
await this.Client.PublishAsync<ShoppingCartItemAdded>(data, x );
}
Subscriber part:
public class ShoppingCartItemAddedConsumer
{
private readonly ILogger<ShoppingCartItemAddedConsumer> logger;
private readonly IBusClient client;
public ShoppingCartItemAddedConsumer(ILogger<ShoppingCartItemAddedConsumer> logger, IBusClient client)
{
this.logger = logger;
this.client = client;
this.logger.LogInformation("Subscriber created");
}
public async void Run()
{
const string QUEUE_NAME = "myWebApi";
const string EXCHANGE_NAME = "myRabbit";
this.logger.LogInformation("Registering subscriber");
await client.SubscribeAsync<ShoppingCartItemAdded>(async msg => {
this.logger.LogInformation("Message received from rabbitmq : {message}", msg);
}, ctx => ctx.UseSubscribeConfiguration(cfg =>
cfg.OnDeclaredExchange(dex => dex.WithName(EXCHANGE_NAME)
.WithAutoDelete(false)
.WithDurability(true)
.WithType(ExchangeType.Topic)
)
.FromDeclaredQueue(dq => dq.WithName(QUEUE_NAME)
.WithExclusivity(false)
.WithDurability(true)
.WithAutoDelete(false))));
this.logger.LogInformation("Subscriber registered");
}
}
And I registered the subscriber as a singleton service which I call its Run()
method in the Startup.cs
var consumer = app.ApplicationServices.GetRequiredService<ShoppingCartItemAddedConsumer>();
consumer.Run();
and this is the log at Startup of the services:
[09:02:25 INF] Subscriber created
[09:02:26 INF] Registering subscriber
[09:02:26 INF] Configuration action for shoppingcartitemadded found.
[09:02:26 INF] Declaring queue myWebApi.
[09:02:26 INF] Declaring exchange myRabbit.
[09:02:26 INF] Binding queue myWebApi to exchange myRabbit with routing key shoppingcartitemadded
[09:02:26 INF] Preparing to consume message from queue 'myWebApi'.
[09:02:26 INF] Subscriber registered
and the following is the log when publishing a message:
[14:13:35 INF] Setting 'Publish Acknowledge' for channel '3'
[14:13:35 INF] Setting up publish acknowledgement for 1 with timeout 0:00:01
[14:13:35 INF] Sequence 1 added to dictionary
[14:13:35 WRN] No body found in the Pipe context.
[14:13:35 INF] Performing basic publish with routing key shoppingcartitemadded on exchange myRabbitAPI.
[14:13:35 INF] Setting up publish acknowledgement for 2 with timeout 0:00:01
[14:13:35 INF] Sequence 2 added to dictionary
[14:13:35 WRN] No body found in the Pipe context.
[14:13:35 INF] Performing basic publish with routing key shoppingcartitemadded on exchange myRabbitAPI.
[14:13:35 INF] Executed action method HelloMicroServices.Controllers.ShoppingCartController.Post (HelloMicroServices), returned result Microsoft.AspNetCore.Mvc.OkObjectResult in 304.6292ms.
[14:13:35 INF] Executing ObjectResult, writing value of type 'HelloMicroServices.Datastores.Models.ShoppingCart'.
[14:13:35 INF] Executed action HelloMicroServices.Controllers.ShoppingCartController.Post (HelloMicroServices) in 414.4309ms
[14:13:35 INF] Request finished in 475.1868ms 200 application/json; charset=utf-8
[14:13:35 INF] Recieived ack for 1
[14:13:35 INF] Recieived ack for 2