windows下 .net core3.1 rabbitmq 操练--代码-篇 (2)

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 using RabbitMQ.Client;
 5 
 6 namespace RabbitMQ
 7 {
 8     public class RabbitMQHelper
 9     {
10         /// <summary>
11         /// 创建连接,缺点是每次都会建立tcp连接消耗性能, 可优化为连接池...
12         /// </summary>
13         /// <returns></returns>
14         public static IConnection CreateConnection()
15         {
16             IConnectionFactory conn = new ConnectionFactory()
17             {
18                 HostName = "127.0.0.1",
19                 Port = 5672,
20                 UserName = "xxx",
21                 Password = "123456",
22                 VirtualHost = "/",
23                 AutomaticRecoveryEnabled = true, ////自动重连
24                 RequestedHeartbeat = TimeSpan.FromSeconds(60), //心跳
25             };
26             return conn.CreateConnection();
27         }
28 
29         private const string ExchangeName = "Log.Exchange";
30         private const string QueueName = "Log.Queue";
31         private const string RoutingKey = "Log.RoutingKey";
32         public static void SendMsg()
33         {
34             using (IConnection conn= CreateConnection())
35             {
36                 //创建信道,IConnection接口可用于打开一个通道,该通道可以被用来发送和接收消息
37                 using (IModel channel = conn.CreateModel())
38                 {
39                     //定义交换机:ExchangeType.Direct直连交换机,路由key精准匹配,是根据消息携带的路由key将消息投递给对应的队列,durable=true 持久化
40                     channel.ExchangeDeclare(ExchangeName, ExchangeType.Direct, true);
41 
42                     //定义队列,durable=true 持久化
43                     channel.QueueDeclare(QueueName, true);
44 
45                     //设置队列的消息过期时间/毫秒
46                     channel.QueueDeclare(QueueName, true, false, false, new Dictionary<string, object>
47                     {
48                         { "x-message-ttl" , 30*1000 }
49                     });
50 
51                     //把交换机跟队列绑定,可以绑定多个队列,并设置路由key
52                     channel.QueueBind(QueueName, ExchangeName, RoutingKey);
53 
54                     //要发送的消息
55                     byte[] bodyMsg = Encoding.UTF8.GetBytes("随机消息日志" + Guid.NewGuid().ToString());
56                     //定义消息属性
57                     IBasicProperties props = channel.CreateBasicProperties();
58                     //消息格式
59                     props.ContentType = "text/plain";
60                     //消息持久性,1非持久,2持久.或设置props.Persistent = true;
61                     props.DeliveryMode = 2;
62                     //props.Persistent = true;
63 
64                     //设置头部
65                     props.Headers = new Dictionary<string, object>
66                     {
67                         { "user", "掌声" },
68                         { "age", 18 }
69                     };
70 
71                     //消息的过期时间
72                     //目前有两种方法可以设置消息的 TTL 。
73                     //第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。
74                     //第二种方法是对消息本身进行单独设置,每条消息的TTL可以不同。
75                     ///如果两种方法一起使用,则消息的TTL以两者之间较小的那个数值为准。
76                     //对于第一种设置队列属性的方法,一旦消息过期,就会从队列中抹去,
77                     //而在第二种方法中,即使消息过期,也不会马上从队列中抹去,因为每条消息是否过期是在即将投递到消费者之前判定的。
78                     //为什么这两种方法处理的方式不一样?
79                     //因为第一种方法里,队列中己过期的消息肯定在队列头部,RabbitMQ只要定期从队头开始扫描是否有过期的消息即可。而第二种方法里,每条消
80                     //息的过期时间不同,如果要删除所有过期消息势必要扫描整个队列,所以不如等到此消息即将被消费时再判定是否过期,如果过期再进行删除即可。
81                     //设置消息过期时间/毫秒
82                    // props.Expiration = "60000";
83                     
84 
85 
86                     //将消息发送给交换机,交换机根据传入的路由key,转交到对应的队列
87                     channel.BasicPublish(ExchangeName, RoutingKey, props, bodyMsg);
88                 }
89             }
90         }
91     }
92 }

 

windows下 .net core3.1 rabbitmq 操练--代码-篇 (2)

上一篇:PHP开发api接口安全验证 -- 逻辑严谨性判断


下一篇:如何清除*:WIN32/WACATAC.B!ML病毒