Я использую EventMachine уже довольно давно и знаю, что это действительно здорово, так как It Manage показывает мне гораздо больше, что мне не нужно ни о чем беспокоиться. Но недавно я только что обнаружил эту странную проблему, которую я просто не понимаю.
Вот что только что рассказал
У меня есть цикл Eventmachine, который выглядит так
EventMachine::run {
EventMachine::add_periodic_timer(10) do
EventMachine::defer(@operation_block,@callback_block)
end
}
вот как выглядит мой рабочий блок (код ниже использует amqp с использованием морковного камня)
@operation_block = Proc.new { begin puts "Initiating the queue" @carrot ||= Carrot.new(:host => localhost) @queue ||= @carrot.queue("my_queue") puts "The Queue is Poping the message" if @queue.pop [MY LOGIC HERE] $input_to_callback = "SUCCESS" ## IF LOGIC GET EVALUATED WITHOUT ERROR ELSE WILL SET TO FAIL else $input_to_callback = "NOTHING TO PROCESSES" end rescue puts e retry! end $input_to_callback }
Здесь мой блок обратного вызова выглядит так
@callback_block = Proc.new {|operation_block_output|
if operation_block_output == "SUCCESS"
puts "YAHOOOOOOOOO SUCCESS"
elsif operation_block_output == "NOTHING TO PROCESSES"
puts "BOO Nothing to processes"
else
puts "FAIL ALARM"
end
}
А вот и беда. Код работает, пока не случится что-то плохое. Вот что я имел в виду.
Теперь предположим, что я запускаю этот код выше
У меня есть имя набора очереди «my_queue», или он создаст его, если он не существует, очередь изначально пуста
вот вывод, который я получаю на консоли
Инициация очереди
Очередь выдает сообщение
BOO Нечего обрабатывать
Когда я создал сообщение, вывод изменился в консоли соответственно на основе
Теперь беда
Если я на мгновение отключу свой сервер AMQP, вот вывод (чтобы показать, что я имел в виду)
Инициация очереди
Сломанная труба => Ошибка, пойманная в начале спасательного блока в рабочем блоке
Теперь запустите сервер AMQP
Код просто никогда не продвигается вперед от строки, в которой он в настоящее время получил ошибку, что означает, что я никогда не печатаю строку
Очередь выдает сообщение
не только текущая отсрочка, для которой произошла повторная попытка, но и новый блок операции отсрочки, который инициируется после того, как только что истекло время таймера, т. е. средства последующего вызова блока операции, кажется, никогда не продвигаются вперед и выполняют обработку и всегда печатают только следующий вывод
Initiating the queue
Просто никогда не двигайтесь вперед (застревает) и выполняйте обработку, которая означала, например, получение сообщения из очереди, соответствующую обработку и все остальное (поскольку сервер AMQP работает сейчас)
Спасибо