Ejemplo n.º 1
0
 private static void StartConsumer(IModel channel, AbstractMqMessagePath[] mqMessagePaths)
 {
     if (mqMessagePaths == null || mqMessagePaths.Length == 0)
     {
         return;
     }
     Task.Factory.StartNew(() => {
         DateTime startOn = DateTime.Now;
         // mq消费者不是立即启动的,而是异步启动的,在满足了后续的条件后才会启动的。
         while (!mqMessagePaths.All(a => a.IsReadyToBuild))
         {
             if (startOn.AddSeconds(20) < DateTime.Now)
             {
                 NTMinerConsole.UserFail("订阅Mq失败,因为超时");
                 return;
             }
             System.Threading.Thread.Sleep(100);
         }
         foreach (var mqMessagePathsByQueue in mqMessagePaths.GroupBy(a => a.Queue))
         {
             string queue = mqMessagePathsByQueue.Key;
             bool durable = queue.EndsWith(MqKeyword.DurableQueueEndsWith);
             bool autoAck = !durable;
             channel.QueueDeclare(
                 queue: queue,
                 durable: durable,
                 exclusive: false,
                 autoDelete: !durable,
                 arguments: null);
             EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
             foreach (var mqMessagePath in mqMessagePathsByQueue)
             {
                 mqMessagePath.Build(channel);
             }
             consumer.Received += (model, ea) => {
                 bool isPass = false;
                 foreach (var mqMessagePath in mqMessagePathsByQueue)
                 {
                     try {
                         if (!isPass)
                         {
                             isPass = mqMessagePath.Go(ea);
                         }
                         else
                         {
                             mqMessagePath.Go(ea);
                         }
                     }
                     catch (Exception e) {
                         Logger.ErrorDebugLine(e);
                     }
                 }
                 if (!isPass)
                 {
                     Logger.WarnDebugLine($"路由键 {ea.RoutingKey} 没有消费者");
                 }
                 if (!autoAck)
                 {
                     channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
                 }
             };
             channel.BasicConsume(queue: queue, autoAck: autoAck, consumer: consumer);
         }
         NTMinerConsole.UserOk("订阅Mq成功");
     });
 }