public IBus Register <TMessage, TProcessMessageHandler>(string queueName = "", string routeKey = "") where TMessage : class where TProcessMessageHandler : IProcessMessageHandler <TMessage> { var connection = _subscribeLoadBlancer.Resolve(); if (!connection.IsConnected) { connection.TryConnect(); } for (int i = 0; i < _reveiverMaxDegreeOfParallelism; i++) { System.Threading.Tasks.Task.Run(() => { try { var _channel = connection.GetModel(); var _queueName = string.IsNullOrEmpty(queueName) ? typeof(TProcessMessageHandler).FullName : queueName; var _routeKey = string.IsNullOrEmpty(routeKey) ? typeof(TMessage).FullName : routeKey; var EventAction = _serviceProvider.GetService(typeof(TProcessMessageHandler)) as IProcessMessageHandler <TMessage>; if (EventAction == null) { EventAction = System.Activator.CreateInstance(typeof(TProcessMessageHandler)) as IProcessMessageHandler <TMessage>; } _channel.ExchangeDeclare(_exchange, _exchangeType, true, false, null); //在MQ上定义一个持久化队列,如果名称相同不会重复创建 _channel.QueueDeclare(_queueName, true, false, false, null); //绑定交换器和队列 _channel.QueueBind(_queueName, _exchange, _routeKey); //绑定交换器和队列 _channel.QueueBind(_queueName, _exchange, _queueName); //输入1,那如果接收一个消息,但是没有应答,则客户端不会收到下一个消息 _channel.BasicQos(0, _prefetchCount, false); //在队列上定义一个消费者a EventingBasicConsumer consumer = new EventingBasicConsumer(_channel); consumer.Received += async(ch, ea) => { #region AMQP Received try { #region Ensure IsConnected if (!connection.IsConnected) { connection.TryConnect(); } #endregion string carrierId = ""; if (ea.BasicProperties.Headers != null && ea.BasicProperties.Headers.ContainsKey("x-carrier-id")) { carrierId = Encoding.UTF8.GetString((ea.BasicProperties.Headers["x-carrier-id"] as byte[])); } var messageResponse = new MessageResponse() { MessageId = string.IsNullOrEmpty(ea.BasicProperties.MessageId) ? Guid.NewGuid().ToString("N") : ea.BasicProperties.MessageId, Headers = ea.BasicProperties.Headers ?? new Dictionary <string, object>(), Body = default(TMessage), QueueName = _queueName, RouteKey = _routeKey, BodySource = Encoding.UTF8.GetString(ea.Body), CarrierId = carrierId }; try { messageResponse.Body = JsonConvert.DeserializeObject <TMessage>(messageResponse.BodySource); } catch (Exception ex) { _logger.LogError(ex, ex.Message); } if (!messageResponse.Headers.ContainsKey("x-exchange")) { messageResponse.Headers.Add("x-exchange", _exchange); } if (!messageResponse.Headers.ContainsKey("x-exchange-type")) { messageResponse.Headers.Add("x-exchange-type", _exchangeType); } #region AMQP ExecuteAsync try { var handlerOK = await _eventBusReceiverPolicy.ExecuteAsync(async(cancellationToken) => { return(await EventAction.Handle(messageResponse.Body, (Dictionary <string, object>)messageResponse.Headers, cancellationToken)); }, CancellationToken.None); if (handlerOK) { if (_ackHandler != null) { _ackHandler(new MessageResponse[] { messageResponse }); } //确认消息 _channel.BasicAck(ea.DeliveryTag, false); } else { //重新入队,默认:是 var requeue = true; try { //执行回调,等待业务层确认是否重新入队 if (_nackHandler != null) { requeue = await _nackHandler((new MessageResponse[] { messageResponse }, null)); } } catch (Exception innterEx) { _logger.LogError(innterEx, innterEx.Message); } //确认消息 _channel.BasicReject(ea.DeliveryTag, requeue); } } catch (Exception ex) { //重新入队,默认:是 var requeue = true; try { //执行回调,等待业务层的处理结果 if (_nackHandler != null) { requeue = await _nackHandler((new MessageResponse[] { messageResponse }, ex)); } } catch (Exception innterEx) { _logger.LogError(innterEx, innterEx.Message); } //确认消息 _channel.BasicReject(ea.DeliveryTag, requeue); } #endregion } catch (Exception ex) { _logger.LogError(ex.Message, ex); } #endregion }; consumer.Unregistered += (ch, ea) => { _logger.LogDebug($"MQ:{_queueName} Consumer_Unregistered"); }; consumer.Registered += (ch, ea) => { _logger.LogDebug($"MQ:{_queueName} Consumer_Registered"); }; consumer.Shutdown += (ch, ea) => { _logger.LogDebug($"MQ:{_queueName} Consumer_Shutdown.{ea.ReplyText}"); }; consumer.ConsumerCancelled += (object sender, ConsumerEventArgs e) => { _logger.LogDebug($"MQ:{_queueName} ConsumerCancelled"); }; //消费队列,并设置应答模式为程序主动应答 _channel.BasicConsume(_queueName, false, consumer); _subscribeChannels.Add(_channel); } catch (Exception ex) { _logger.LogError(ex, ex.Message); } }); } return(this); }