хотите, чтобы кролик просто достал текущие вещи из очереди и затем вышел - PullRequest
0 голосов
/ 02 ноября 2018

В настоящее время я обрабатываю сообщения из очереди RabbitMQ в приложении Rails следующим образом:

connection = Bunny.new(host: RABBITMQ_HOST, user: RABBITMQ_USERNAME, pass: RABBITMQ_PASSWORD, automatically_recover: false)
connection.start

channel = connection.create_channel
queue = channel.queue('report_email_queue', durable: true)

channel.prefetch(1)
Rails.logger.info ' [*] Waiting for messages. To exit press CTRL+C'
puts ' [*] Waiting for messages. To exit press CTRL+C'
begin
  queue.subscribe(manual_ack: true, block: true) do |delivery_info, _properties, body|
    Rails.logger.info " [x] Received '#{body}'"
    puts " [x] Received '#{body}'"
    obj = JSON.parse(body)
    site_report_request = SiteReportRequest.find(obj['report_id'])
    site_report_request.queue_response_body = obj
    if obj['status'] == 'success'
      OfflineReportMailer.custom_report(obj).deliver
      site_report_request.email_status = "success_email_sent"
    else 
      OfflineReportMailer.custom_report_error(obj).deliver
      site_report_request.email_status =  "error_email_sent"
    end
    site_report_request.save
    Rails.logger.info ' [x] Done'
    puts ' [x] Done'
    channel.ack(delivery_info.delivery_tag)
  end
rescue Interrupt => _
  connection.close
end

Я бы хотел изменить это на задачу rake, которая вызывается, получает все сообщения из очереди, обрабатывает их и затем завершает работу.

Будет ли использование подписки правильным способом сделать это? Кажется, это создает цикл прослушивания - как мне выйти из этого? Я действительно хочу что-то вроде get_all_messages. Как бы мне отрегулировать это для достижения этого?

...