Пример #1
0
        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);
            //}
        }
Пример #2
0
        /// <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);
                }
            }
        }