I am writing async communication between services so if one goes down the request can't be stopped
so I am doing this scenario
I am turning off my consumer and sending message through the producer
I get a response that the message has been sent successfully
but when I run my consumer on again no message in the queue
Note :
when I don't turn off my consumer i can get my message and consume it
this is my producer code
var factory = new ConnectionFactory() { HostName = "host.docker.internal" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.ExchangeDeclare(exchange: "UserRequestExch", type: ExchangeType.Direct);
UserInfo userInfo = new UserInfo();
userInfo.UserID = GetCurrentUserID();
userInfo.JWT=GetCurrentUserToken();
var mess = System.Text.Json.JsonSerializer.Serialize(userInfo);
var body = Encoding.UTF8.GetBytes(mess);
string RoueKey = "";
switch (Int32.Parse(dataObject["PostponementID"].ToString()))
{
case 1:
RoueKey = "AlonePostponement";
break;
case 2:
RoueKey = "BrotherInServicePostponement";
break;
case 3:
RoueKey = "CashAllowance";
break;
case 4:
RoueKey = "CashAllowancLessThan42";
break;
case 5:
RoueKey = "FixedServiceAllowance";
break;
case 6:
RoueKey = "ObligatoryService";
break;
case 7:
RoueKey = "PostponementOfConvicts";
break;
case 8:
RoueKey = "SchoolPostponement";
break;
case 9:
RoueKey = "TravelApproval";
break;
default:
return NotFound();
}
channel.BasicPublish("UserRequestExch", RoueKey, null, body);
return Ok("The request has been received and is now being processed");
my consumer code :
factory = new ConnectionFactory() { HostName = "host.docker.internal" };
connection = factory.CreateConnection();
channel = connection.CreateModel();
channel.ExchangeDeclare(exchange: "UserRequestExch", ExchangeType.Direct);
var queName = channel.QueueDeclare().QueueName;
channel.QueueBind(queue: queName, exchange: "UserRequestExch", routingKey: "TravelApproval");
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var recbody = ea.Body.ToArray();
var recmess = Encoding.UTF8.GetString(recbody);
UserInfo userInfo = JsonSerializer.Deserialize<UserInfo>(recmess);
var User = _context.TravelApprovalDb.Where(x => x.UserID == userInfo.UserID).FirstOrDefault();
if (User == null)
{
int ReqStatuesID = InsertRequestToDB(userInfo.UserID);
SendToExternalAPI(userInfo.JWT, ReqStatuesID);
}
else
{
if (User.DateOfEnd.DateTime > DateTime.Now)
{
int ReqStatuesID = InsertRequestToDB(userInfo.UserID);
SendToExternalAPI(userInfo.JWT, ReqStatuesID);
}
}
channel.BasicAck(deliveryTag:ea.DeliveryTag,multiple:true);
};
channel.BasicConsume(queue: queName, consumer: consumer);
System.Console.Read();
I have applied persistent volume to the rappitMQ in docker-compose
volumes:
- rabbitmq:/var/lib/rabbitmq
or
- ~/.docker-conf/rabbitmq/data/:/var/lib/rabbitmq/
- ~/.docker-conf/rabbitmq/log/:/var/log/rabbitmq
I removed auto ack and put
channel.BasicAck(deliveryTag:ea.DeliveryTag,multiple:true);
but nothing happened