私はかなり長い間 EventMachine を使用してきましたが、It Manage が何も心配する必要がないことをより多く示してくれるので、本当に素晴らしいと思いました。しかし、最近、理解できないこの奇妙な問題を見つけました。
ここで言っていることは
私はこのように見えるEventmachineループを持っています
EventMachine::run {
EventMachine::add_periodic_timer(10) do
EventMachine::defer(@operation_block,@callback_block)
end
}
ここで私の操作ブロックは次のようになります(ニンジンgemを使用した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 サーバーが現在実行されているため)。
ありがとう