基于RabbitMQ消息消费ID(c#API)

问题描述 投票:0回答:2

我想发布/产生带有某些消息ID的消息,就像每条消息都有特定的ID。

并且在消费者端,我想通过私有ID来检索消息。假设我们有多个使用者,那么每个使用者仅应通过消息ID获得他们请求的消息。 (我希望我足够清楚)。

c# api message-queue rabbitmq
2个回答
0
投票

您可能最好为此使用数据库。

alexis(rabbitmq)


0
投票

尽管不是设计使然,并且最好使用数据库,但有一种方法可以使用rabbitmq做到这一点。

发布带有ID的消息:

var message = "some message";
var messageId = Guid.NewGuid().ToString();
var factory = new ConnectionFactory { HostName = "localhost" };

using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
    IBasicProperties props = channel.CreateBasicProperties();
    props.MessageId = messageId;

    byte[] messageBodyBytes = Encoding.UTF8.GetBytes(message);

    channel.BasicPublish("", "queueName", true, props, messageBodyBytes);
}

通过ID获取消息:

var messageId = "id";
var factory = new ConnectionFactory { HostName = "localhost" };

using (var connection = _factory.CreateConnection())
using (var channel = connection.CreateModel())
{
    var queueDeclareResponse = channel.QueueDeclare("queueName", true, true, false, null);

    for (int i = 0; i < queueDeclareResponse.MessageCount; i++)
    {
        var result = channel.BasicGet("queueName", false);
        var id = result.BasicProperties.MessageId;

        if (id == messageId)
        {
            var body = result.Body;
            var message = Encoding.UTF8.GetString(body);

            //Do something with the message

            channel.BasicAck(result.DeliveryTag, false);
            break;
        }
    }
}

channel被处理后,所有未acked的消息将重新排队。

© www.soinside.com 2019 - 2024. All rights reserved.