c# – RabbitMQ 3.5和消息优先级

前端之家收集整理的这篇文章主要介绍了c# – RabbitMQ 3.5和消息优先级前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
RabbitMQ 3.5现在 supports message priority;
但是,我无法建立一个有效的例子.我把我的代码放在下面.它包括我期望的输出和实际的输出.我会对更多文档和/或工作示例感兴趣.

所以我的问题很简单:如何在Rabbit 3.5.0.0中使用消息优先级?

出版商:

  1. using System;
  2. using RabbitMQ.Client;
  3. using System.Text;
  4. using System.Collections.Generic;
  5.  
  6. class Publisher
  7. {
  8.  
  9. public static void Main()
  10. {
  11. var factory = new ConnectionFactory() { HostName = "localhost" };
  12. using (var connection = factory.CreateConnection())
  13. {
  14. using (var channel = connection.CreateModel())
  15. {
  16. IDictionary <String,Object> args = new Dictionary<String,Object>() ;
  17. args.Add(" x-max-priority ",10);
  18. channel.QueueDeclare("task_queue1",true,false,args);
  19.  
  20. for (int i = 1 ; i<=10; i++ )
  21. {
  22. var message = "Message";
  23. var body = Encoding.UTF8.GetBytes(message + " " + i);
  24. var properties = channel.CreateBasicProperties();
  25. properties.SetPersistent(true);
  26. properties.Priority = Convert.ToByte(i);
  27. channel.Basicpublish("","task_queue1",properties,body);
  28. }
  29. }
  30. }
  31. }
  32. }

消费者:

  1. using System;
  2. using RabbitMQ.Client;
  3. using RabbitMQ.Client.Events;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Collections.Generic;
  7.  
  8. namespace Consumer
  9. {
  10. class Worker
  11. {
  12. public static void Main()
  13. {
  14. var factory = new ConnectionFactory() { HostName = "localhost" };
  15. using (var connection = factory.CreateConnection())
  16. {
  17. using (var channel = connection.CreateModel())
  18. {
  19. IDictionary<String,Object>();
  20. channel.BasicQos(0,1,false);
  21. var consumer = new QueueingBasicConsumer(channel);
  22. IDictionary<string,object> consumerArgs = new Dictionary<string,object>();
  23. channel.BasicConsume( "task_queue1","",args,consumer);
  24. Console.WriteLine(" [*] Waiting for messages. " +
  25. "To exit press CTRL+C");
  26. while (true)
  27. {
  28. var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
  29. var body = ea.Body;
  30. var message = Encoding.UTF8.GetString(body);
  31. Console.WriteLine(" [x] Received {0}",message);
  32. channel.BasicAck(ea.DeliveryTag,false);
  33. }
  34. }
  35. }
  36. }
  37. }
  38. }

实际产量:

  1. [*] Waiting for messages. To exit press CTRL+C
  2. [x] Received Message 1
  3. [x] Received Message 2
  4. [x] Received Message 3
  5. [x] Received Message 4
  6. [x] Received Message 5
  7. [x] Received Message 6
  8. [x] Received Message 7
  9. [x] Received Message 8
  10. [x] Received Message 9
  11. [x] Received Message 10

预期产量:

  1. [*] Waiting for messages. To exit press CTRL+C
  2. [x] Received Message 10
  3. [x] Received Message 9
  4. [x] Received Message 8
  5. [x] Received Message 7
  6. [x] Received Message 6
  7. [x] Received Message 5
  8. [x] Received Message 4
  9. [x] Received Message 3
  10. [x] Received Message 2
  11. [x] Received Message 1

更新#1.
我在Java here中找到了一个例子.但是它是Rabbit 3.4.x.x.添加到3.5中的插入.
我能看到的唯一区别是它们将优先级表示为int而我的是一个字节.但我觉得那是一个红鲱鱼.我在这里有点不知所措.

解决方法

好吧,我解决了.
这是一个愚蠢的错误.
我写:
  1. args.Add(" x-max-priority ",10);

它应该是

  1. args.Add("x-max-priority",10);

我会把它留下来,以便其他人可以在C#中有一个Rabbitmq 3.5的优先级队列的工作示例.

猜你在找的C#相关文章