我一直在使用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服務器現在正在運行)
由於