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

发布于 2024-09-13 23:49:55 字数 125 浏览 12 评论 0原文

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

在消费者端,我想通过提供ID来检索消息。 假设我们有多个消费者,那么每个消费者应该只获取他们通过消息 ID 请求的消息。 (我希望我足够清楚)。

i would like to publish/produce a message with some message id, like each message has a particular id..

And at the consumer end i would like to retrieve the messages by prividing the ID.
suppose we have multiple consumers than each one should get only those messages which they requested through the message ids. (i hope i am clear enough).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

眼中杀气 2024-09-20 23:49:56

虽然这不是设计使然,最好使用数据库,但有一种方法可以使用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;
        }
    }
}

处置通道后,所有未确认的消息都将重新排队。

Although its not by design and its better to use a database for that there is a way to do this using rabbitmq:

Publish a message with 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);
}

Get a message by 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;
        }
    }
}

After channel is disposed all messages that was not acked will requeue.

清浅ˋ旧时光 2024-09-20 23:49:56

为此,您最好使用数据库。

亚历克西斯(rabbitmq)

You might be better off using a database for this.

alexis (rabbitmq)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文