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成功"); }); }