Я давно пользуюсь EventMachine, и я действительно считаю, что это здорово, потому что Управление показывает мне гораздо больше, что мне не о чем беспокоиться. Но недавно я обнаружил эту странную проблему, которую мне просто не удалосьпонять
Вот что просто говорит
У меня есть цикл 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).г сейчас работает)
Спасибо