我使用EventMachine已经有一段时间了,我真的发现它很棒,因为它能让我看到更多我不必担心的事情。但是最近我发现了这个奇怪的问题,我就是不明白。
这是刚刚说的
我有EventMachine循环,看起来像这样
EventMachine::run {
EventMachine::add_periodic_timer(10) do
EventMachine::defer(@operation_block,@callback_block)
end
}
在这里,我的操作块看起来像(下面的代码使用CarrobGem使用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
}
现在麻烦来了
尽管代码按它应该的方式工作,直到发生错误为止。
我的意思是
现在假设我运行上面的代码
我有一个队列集名称“我的队列”,或者如果它不存在,它将创建一个队列。队列最初是空的。
这里是我在控制台上得到的输出
启动队列
队列正在弹出消息
boo没有要处理的内容
当我消息生成时,控制台中的输出将根据
现在麻烦来了
如果我在这里暂时关闭AMQP服务器,输出(显示我的意思)
启动队列
管道断开=>陷入错误
在操作块中开始救援块
现在启动AMQP服务器
代码似乎从未从当前出错的行向前移动。
这意味着我似乎从来没有打印过这行
队列正在弹出消息
不仅发生了重试的当前延迟,而且新的延迟操作块在计时器时间刚过之后启动。
即随后调用操作块的方式
似乎从来没有向前推进,做处理,总是打印以下内容
仅输出
Initiating the queue
似乎从来没有向前移动(卡住)并做它打算做的处理,即从队列中提取消息,相应地做处理,以及所有其他事情(因为amqp服务器现在正在运行)。
谢谢