0

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

burnsi
  • 6,194
  • 13
  • 17
  • 27

0 Answers0