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 }