В настоящее время я обрабатываю сообщения из очереди 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. Как бы мне отрегулировать это для достижения этого?