Eventmachine::defer + рубин

Я использую 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 работает сейчас)

Спасибо


person Viren    schedule 22.10.2010    source источник


Ответы (1)


Аман Гупта ответил на вопрос выше https://github.com/eventmachine/eventmachine/issues/127#issuecomment-535210

person Viren    schedule 21.06.2011