代码之家  ›  专栏  ›  技术社区  ›  noblerare

如何让rabbitmq逐个从队列中读取?

  •  2
  • noblerare  · 技术社区  · 7 年前

    我只是在玩rabbitmq,并尝试在两个C_项目中设置测试发送方和接收方。

    测试发送方.cs

    using System;
    using RabbitMQ.Client;
    using System.Text;
    
    public class TestSender
    {
        public TestSender()
        {
        }
    
        public static void Main()
        {
            var factory = new ConnectionFactory() { HostName = "localhost" };
            using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    channel.QueueDeclare(queue: "Test Queue",
                                        durable: true,
                                        exclusive: false,
                                        autoDelete: false,
                                        arguments: null);
    
                    Console.WriteLine(" Press [S] to send a message, [Enter] to exit.");
    
                    ConsoleKey key;
                    int messageId = 0;
                    while (true)
                    {
                        key = Console.ReadKey(true).Key;
    
                        if (key == ConsoleKey.Enter)
                            break;
    
                        if (key == ConsoleKey.S)
                        {
                            string message = "Message " + (++messageId).ToString();
                            var body = Encoding.UTF8.GetBytes(message);
    
                            channel.BasicPublish(exchange: "",
                                                 routingKey: "hello",
                                                 basicProperties: null,
                                                 body: body);
                            Console.WriteLine("Sent {0}", message);
                        }
                    }
                }
            }
        }
    }
    

    测试接收器.cs

    using RabbitMQ.Client;
    using RabbitMQ.Client.Events;
    using System;
    using System.Text;
    
    public class TestReceiver
    {
        public TestReceiver()
        {
        }
    
        public static void Main()
        {
            var factory = new ConnectionFactory() { HostName = "localhost" };
            using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    // Declare the queue here because we might start the consumer before the publisher 
                    // so the queue should exist before we try to consume messages from it.
                    channel.QueueDeclare(queue: "Test Queue",
                                         durable: true,
                                         exclusive: false,
                                         autoDelete: false,
                                         arguments: null);
    
                    var consumer = new EventingBasicConsumer(channel);
                    Console.WriteLine(" Press [R] to receive a message, [Enter] to exit.");
    
                    // Register a consumer to listen to a specific queue. 
                    channel.BasicConsume(queue: "Test Queue",
                                         autoAck: true,
                                         consumer: consumer);
    
                    ConsoleKey key;
                    while (true)
                    {
                        key = Console.ReadKey(true).Key;
    
                        if (key == ConsoleKey.Enter)
                            break;
    
                        if (key == ConsoleKey.R)
                        {
                            consumer.Received += (model, ea) =>
                            {
                                var body = ea.Body;
                                var message = Encoding.UTF8.GetString(body);
                                Console.WriteLine("Received {0}", message);
                            };
    
    
                        }
                    }
                }
            }
        }
    }
    

    我的设置方式是这样的,如果你按下 S 键,它将向队列发送消息,如果按 R 键,它从队列中读取。发送有效,但接收无效。我移除了 while 循环和按键代码和接收工作。但是,我想知道如何一个接一个地使用消息,而不是同时使用所有消息。此外,是否有人知道rabbitmq可以在队列中持久化消息,或者在使用消息时必须将其出列?

    1 回复  |  直到 7 年前
        1
  •  1
  •   rjsaran    7 年前