上一篇文章使用的是Direct的Exchange,但是没有指定Queue的名字,这样只能是先运行Consumer之后,Producer在运行发消息Consumer才能收到,否则先运行Producer发送消息,在运行Consumer是收不到之前Producer发送的消息,因为Queue的名字像是这样的:amq.gen-X-XSTaseUmil42zrawBVsw都是临时,如果Consumer关闭之后,这个Queue就会自动被RabbitMQ删掉。

如果想创建可以先执行Producer的Direct的Exchnage呢?因为在实际工作中我们可能需要发送端有消息就会一直发给接收端,不管接收端是否已经运行。如果我们需要指定名称的Queue,并且使用Direct的Exchange方式,我们需要使用Binding的方式。上一篇和第一篇文章中都解释了绑定的含义:绑定其实就是关联了exchange和queue。

多个routing key指定同一个queue,不管如何指定routing key的名字,发送端发送一次信息,接收端按启动顺序循环执行接收,每次接收一个消息。例子:

Producer.cs

 1 /// <summary>
 2         /// 多个routing key指定同一个queue
 3         /// 指定Queue的名称,好处就是可以持久化Queue
 4         /// </summary>
 5         /// <param name="args">
 6         /// SendDemo51.exe direct_custom_routing_key_hello1
 7         /// SendDemo51.exe direct_custom_routing_key_hello2
 8         /// 不管如何指定routing key的名字,发送端发送一次信息,接收端按启动顺序循环执行每次接收一个消息。
 9         /// </param>
10         static void Main(string[] args)
11         {
12             if (args.Length < 1)
13             {
14                 Console.Error.WriteLine("请指定一个新的Routing Key名称", Environment.GetCommandLineArgs()[0]);
15                 Environment.ExitCode = 1;
16                 return;
17             }
18             var factory = new ConnectionFactory() { HostName = "localhost" };
19             using (var connection = factory.CreateConnection())
20             {
21                 using (var channel = connection.CreateModel())
22                 {
23                     const string EXCHANGE_NAME = "direct_logs";
24                     channel.ExchangeDeclare(EXCHANGE_NAME, "direct");//Direct :如果 routing key 匹配, 那么Message就会被传递到相应的queue中。
25 
26                     const string QUEUE_NAME = "direct_same_queue_name_hello";//使用我们自己指定Queue的名称
27                     bool durable = true;
28                     channel.QueueDeclare(QUEUE_NAME, durable, false, false, null);
29 
30                     var routingKey = args[0];//指定Routing Key的名称
31                     channel.QueueBind(QUEUE_NAME, EXCHANGE_NAME, routingKey);//通过绑定将指定的Queue名称、不同的RoutingKey名称使用Direct的Exchange方式进行关联
32 
33                     var message = "Hello World! " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
34 
35                     var body = Encoding.UTF8.GetBytes(message);
36 
37                     var properties = channel.CreateBasicProperties();
38                     properties.SetPersistent(true);//需要持久化Message,即在Publish的时候指定一个properties
39 
40                     channel.BasicPublish(EXCHANGE_NAME, routingKey, properties, body);
41                     Console.WriteLine(" [x] Sent '{0}':'{1}'", routingKey, message);
42 
43                     Console.Read();
44                 }
45             }
46         }
Producer.cs

相关文章:

  • 2021-12-23
  • 2021-12-05
  • 2022-12-23
  • 2021-12-02
  • 2021-07-19
  • 2021-09-06
  • 2021-11-02
猜你喜欢
  • 2021-11-24
  • 2022-01-13
  • 2021-10-07
  • 2021-05-27
  • 2022-12-23
相关资源
相似解决方案