Exemplo n.º 1
0
        /// <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;
            }
        }
Exemplo n.º 2
0
        /// <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);
        }