/// <summary> /// Acknowledges received message. Throws exception on error. /// </summary> /// <param name="ackType"></param> /// <param name="deliveryTag"></param> public static void AcknowledgeMessage(ManualAckType ackType, ulong deliveryTag) { if (_channel == null) { // do not try to re-connect, because messages already nacked automatically throw new Exception("No connection to RabbitMQ"); } switch (ackType) { case ManualAckType.Ack: _channel.BasicAck(deliveryTag, multiple: false); break; case ManualAckType.Nack: _channel.BasicNack(deliveryTag, multiple: false, requeue: false); break; case ManualAckType.NackAndRequeue: _channel.BasicNack(deliveryTag, multiple: false, requeue: true); break; case ManualAckType.Reject: _channel.BasicReject(deliveryTag, requeue: false); break; case ManualAckType.RejectAndRequeue: _channel.BasicReject(deliveryTag, requeue: true); break; } }
/// <summary> /// Reads message(s) from a queue. Returns JSON structure with message contents. Message data is byte[] encoded to base64 string /// </summary> /// <param name="inputParams"></param> /// <returns>JSON structure with message contents</returns> public static Output ReadMessage([PropertyTab] ReadInputParams inputParams) { Output output = new Output(); OpenConnectionIfClosed(inputParams.HostName, inputParams.ConnectWithURI); //channel.QueueDeclare(queue: inputParams.QueueName, // durable: false, // exclusive: false, // autoDelete: false, // arguments: null); while (inputParams.ReadMessageCount-- > 0) { var rcvMessage = _channel.BasicGet(queue: inputParams.QueueName, autoAck: inputParams.AutoAck == ReadAckType.AutoAck); if (rcvMessage != null) { output.Messages.Add(new Message { Data = Convert.ToBase64String(rcvMessage.Body), MessagesCount = rcvMessage.MessageCount, DeliveryTag = rcvMessage.DeliveryTag }); } //break the loop if no more messagages are present else { break; } } // Auto acking if (inputParams.AutoAck != ReadAckType.AutoAck && inputParams.AutoAck != ReadAckType.ManualAck) { ManualAckType ackType = ManualAckType.NackAndRequeue; switch (inputParams.AutoAck) { case ReadAckType.AutoNack: ackType = ManualAckType.Nack; break; case ReadAckType.AutoNackAndRequeue: ackType = ManualAckType.NackAndRequeue; break; case ReadAckType.AutoReject: ackType = ManualAckType.Reject; break; case ReadAckType.AutoRejectAndRequeue: ackType = ManualAckType.RejectAndRequeue; break; } foreach (var message in output.Messages) { AcknowledgeMessage(ackType, message.DeliveryTag); } } return(output); }