public void Publish(string mchid, string orderid, int ttl = 0) { PayOrderNotifyMsg msg = new PayOrderNotifyMsg { mchid = mchid, orderid = orderid }; new PayOrderNotify().PublishMessage(msg, ttl); //var msg = new PayOrderNotifyModel { mchid = mchid, orderid = orderid }; //if (ttl <= 0) //{ // DB.RabbiBus.PublishAsync(msg); //} //else //{ // //通过死信发送延迟消息 // var channel = DB.RabbiBus.Advanced; // var exchange = channel.ExchangeDeclare("OrderNotify.Delay.Exchange", ExchangeType.Direct); // string key = string.Format("Pay.OrderNotify.Delay.Ttl_{0}", ttl); // var queue = channel.QueueDeclare(key, deadLetterExchange: "Pay.OrderNotify", deadLetterRoutingKey: "#", perQueueMessageTtl: ttl * 1000); // var binding = channel.Bind(exchange, queue, key); // var message = new Message<Mq.Messages.PayOrderNotify>(msg); // channel.Publish(exchange, key, false, message); //} }
/// <summary> /// /// </summary> /// <param name="msg"></param> /// <param name="ttl">秒</param> public void PublishMessage(PayOrderNotifyMsg msg, int ttl) { using (var connection = factory.CreateConnection()) { using (var _channel = connection.CreateModel()) { var exchangeA = string.Format("PayOrderNotify.exchange.Delay_ttl_{0}", ttl); var routeA = string.Format("PayOrderNotify.route.Delay_ttl_{0}", ttl); var queueA = string.Format("PayOrderNotify.queue.Delay_ttl_{0}", ttl); var exchangeD = "PayOrderNotify.exchange"; var routeD = "PayOrderNotify.route"; var queueD = "PayOrderNotify.queue"; //_channel.BasicQos(0, 1, false); _channel.ExchangeDeclare(exchangeD, type: "fanout", durable: true, autoDelete: false); _channel.QueueDeclare(queueD, durable: true, exclusive: false, autoDelete: false); _channel.QueueBind(queueD, exchangeD, routeD); //死信交换 这样10秒后消息过期,可以看到queueD中有了消息 _channel.ExchangeDeclare(exchangeA, type: "fanout", durable: true, autoDelete: false); _channel.QueueDeclare(queueA, durable: true, exclusive: false, autoDelete: false, arguments: new Dictionary <string, object> { { "x-dead-letter-exchange", exchangeD }, //设置当前队列的DLX { "x-dead-letter-routing-key", routeD }, //设置DLX的路由key,DLX会根据该值去找到死信消息存放的队列 { "x-message-ttl", ttl * 1000 } //设置消息的存活时间,即过期时间 }); _channel.QueueBind(queueA, exchangeA, routeA); _channel.ConfirmSelect(); var properties = _channel.CreateBasicProperties(); properties.Persistent = true; //发布消息 var body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(msg)); _channel.BasicPublish(exchange: exchangeA, routingKey: routeA, basicProperties: properties, body: body); } } }