2010-10-22 96 views
0

我一直在使用EventMachine了很長一段時間才知道,我真的發現它很棒,因爲它管理顯示更多我,我不必擔心任何事情。但最近我只是發現這個怪異問題,我只是不明白Eventmachine :: defer + ruby​​

這裏是什麼只是告訴

我有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」或如果不存在,它的隊列最初是空的

在這裏,我在控制檯上

得到啓動隊列輸出

隊列爲POPING消息

它會創建一個BOO沒有進程

由於我建立了輸出在控制檯相應更改

現在的麻煩

如果我暫時關閉我的AMQP服務器這裏輸出(顯示我的意思)

啓動隊列

破裂的管道=>錯誤陷於 在運行中啓動救援塊

現在啓動AMQP服務器

代碼只是似乎從來沒有從線目前它遇到錯誤 這意味着我似乎從來沒有打印

隊列爲POPING消息

不僅是當前推遲這是重試線向前邁進發生了,而且還有剛剛過去的定時器時間後啓動的新的延遲操作塊。操作塊 的後續調用電子手段似乎永遠向前邁進並做處理始終打印以下 只輸出

Initiating the queue 

只是似乎永遠前進(卡)並做處理,這意味着即取從隊列中的消息相應地執行處理和所有其他的東西(如AMQP服務器現在正在運行)

由於

回答