RabbitMq(bunny):Rabbitmq从队列中删除消息。承认不起作用

时间:2016-10-26 09:24:47

标签: ruby-on-rails ruby-on-rails-4 rabbitmq bunny

我正在处理我的rabbitMQ记录。为了避免丢失来自rabbitMQ的消息我正在使用rabbitMQ确认策略。出于测试目的,我在代码之前引发了异常,我向RabbitMQ发送了确认。根据我编写的代码,rabbitMQ不应该从我的代码中的行中删除消息,即“c.ack(delivery_info.delivery_tag)”执行。以下是我的代码

begin
MessageService.with_channel do |c|  
  queue = c.queue(QUEUE_NAME, :durable => true)
  exchange = c.topic(TOPIC_NAME, :durable => true)
  queue.bind(exchange, :routing_key => "#{ROUTING_KEY_PREFIX}.#")
  available_messages = queue.message_count
  processed_messages = 0
  fact_object = {}
  while queue.message_count > 0 && processed_messages <= message_limit
    queue.pop(:manual_ack => true) do |delivery_info, properties, payload|
      rad_exam_hash_object = JSON.parse(payload)
      entity_manager,criteria = self.query_revenue_cost_calculation(rad_exam_hash_object)
      fact_object = self.revenue_cost_calculation_result(entity_manager,criteria)
      self.insert_data_into_table(fact_object)
      raise "exception"
      c.ack(delivery_info.delivery_tag)
    end
    processed_messages = processed_messages + 1
    available_messages = processed_messages - 1
  end
  [processed_messages, available_messages,fact_object]
end
rescue
  puts "got exception while processing messages"
end

请帮我修改为什么rabbitMQ正在从队列中删除邮件,即使没有执行“c.ack(delivery_info.delivery_tag)”行。

1 个答案:

答案 0 :(得分:0)

免责声明:我不知道红宝石。 消息从队列中删除:

  • 如果队列被删除
  • 如果他们被承认
  • 如果消息TTL过期。

所以如果不是那样的话,也许它就像pop的工作方式一样。这听起来是在调用AMQP get并且(基于教程)subscribe似乎在调用AMQP consume