如何使用C#从RabbitMQ队列接收单个消息

4
我想知道如何一次只接收一条消息,以下是基本的代码:

以下是实现此功能的基本代码:

var factory = new ConnectionFactory() { HostName = "localhost" };
var connection = factory.CreateConnection()
var channel = connection.CreateModel()
channel.QueueDeclare("hello", false, false, false, null);
var consumer = new QueueingBasicConsumer(channel);
channel.BasicConsume("hello", true, consumer);

BasicDeliverEventArgs ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
Response.Write(message + " Received.");
3个回答

16

如果您想等待1条消息,请继续使用channel.BasicConsume,但在接收到一条消息后退出消费者方法。

如果只想获取1条消息(如果队列中至少存在1条消息),则使用channel.BasicGet

var data = channel.BasicGet(queueName, true);

附言:

CloudAMQP与 .NET:入门指南页面上有很好的例子。


5

如果需要转换消息中的文本,请参考上一条消息。

var data = channel.BasicGet(QueueName, true);
var message = System.Text.Encoding.UTF8.GetString(data.Body);

-1

如果您在使用channel.BasicGet方法时遇到错误,可以使用库的channel.get方法来解决其他语言的问题。这也是我在尝试使用Node.Js实现此操作时遇到的情况。

我的Node.Js代码:

const open = require('amqplib').connect('amqp://admin:password@172.17.0.1:5672?heartbeat:30')
open
  .then(conn => conn.createChannel())
  .then(async channel => {
    console.log('channel created')
    const msg = await channel.get('myQueue')
    if (msg) {
      console.log(msg.content.toString())
      channel.ack(msg)
    }
  })
  .catch(console.warn)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接