/// <summary> /// 重新连接 /// </summary> /// <param name="connection"></param> /// <param name="handler"></param> /// <param name="exChangeName"></param> /// <param name="queueName"></param> /// <param name="routingKey"></param> /// <param name="isNeedDLX"></param> /// <returns></returns> private static IModel Consume(IConnection connection, Func <string, Task <ConsumeActionEnum> > handler, RMQSubscribeModel subscribeModel) { var channel = DefineQueue(connection, subscribeModel); var consumer = new EventingBasicConsumer(channel); ConsumeActionEnum consumeResult = ConsumeActionEnum.RETRY; Task <ConsumeActionEnum> result; consumer.Received += async(ch, ea) => { var body = ea.Body; var message = Encoding.UTF8.GetString(body); result = handler(message); consumeResult = await result; if (consumeResult == ConsumeActionEnum.ACCEPT) { channel.BasicAck(ea.DeliveryTag, false); //消息从队列中删除 } else if (consumeResult == ConsumeActionEnum.RETRY) { channel.BasicNack(ea.DeliveryTag, false, true); //消息重回队列 } else { channel.BasicNack(ea.DeliveryTag, false, false); //消息直接丢弃 } }; channel.BasicConsume(subscribeModel.QueueName, false, consumer); return(channel); }
/// <summary> /// 拉模式消费死信队列 /// </summary> /// <returns></returns> public static async Task <IModel> PullMessageConsumeForDLXAsync(Func <string, Task <ConsumeActionEnum> > handler, RMQSubscribeModel subscribeModel) { var connection = RabbitMQBaseHelper.CreateMQConnectionInPoolNew(); // var channel = connection.CreateModel(); var channel = DefineQueue(connection, subscribeModel); BasicGetResult response = channel.BasicGet(RabbitMQConstant.DLXPrefix + subscribeModel.QueueName, false); if (response != null) { string message = Encoding.UTF8.GetString(response.Body); ConsumeActionEnum consumeResult = ConsumeActionEnum.RETRY; Task <ConsumeActionEnum> result = handler(message); consumeResult = await result; if (consumeResult == ConsumeActionEnum.ACCEPT) { channel.BasicAck(response.DeliveryTag, false); //消息从队列中删除 } else if (consumeResult == ConsumeActionEnum.RETRY) { channel.BasicNack(response.DeliveryTag, false, true); //消息重回队列 } else { channel.BasicNack(response.DeliveryTag, false, false); //消息直接丢弃 } } else { Console.WriteLine($"{RabbitMQConstant.DLXPrefix + subscribeModel.QueueName}暂无可消费信息"); } RabbitMQBaseHelper.ResetMQConnectionToFree(connection); return(channel); }