我使用EventMachine很长一段时间了,我发现它真的很棒,因为它让我更多地看到,最近我不必担心anything.But,我只是发现了一个奇怪的问题,我只是不明白。
在这里,我想说的是
我有一个像这样的Eventmachine循环
EventMachine::run {
EventMachine::add_periodic_timer(10) do
EventMachine::defer(@operation_block,@callback_block)
end
}
在这里,我的操作块看起来像(下面的代码使用了使用胡萝卜宝石的amqp )
@operation_block = Proc.new { begin放置“初始化队列”@胡萝卜||= Carrot.new(:host => localhost) @queue ||= @carrot.queue("my_queue")放置“队列正在弹出消息”,如果@queue.pop在这里的逻辑$input_to_callback =“成功”## --如果逻辑得到无错误的评估--否则,$input_to_callback = "NOTHING TO PROCESSES“将被设置为FAIL,$input_to_callback=”NOTHING TO PROCESSES“,结束拯救,进行重试!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“,如果它不存在,它会创建一个队列,队列最初是空的
这里是我在控制台上得到的输出
启动队列的
队列正在弹出消息Initiating到进程
在我的消息构建时,控制台中的输出更改相应地基于
现在麻烦
如果我暂时关闭这里的AMQP服务器,输出(以显示我的意思)
启动队列的
作业区begin救援块中遇到的断管=>误差
现在启动AMQP服务器
代码似乎从未从当前出现错误的行向前移动,这意味着我从未打印过这条线。
队列正在弹出消息。
不仅发生了重试的当前延迟操作,而且在计时器时间刚刚过去之后启动的新的延迟操作块(也就是对操作块的后续调用)似乎从未向前移动并进行处理,并且始终只打印以下输出
Initiating the queue
只是永远不要前进(卡住),做它意味着的处理,即从队列中获取消息,相应地进行处理和所有其他东西(就像AMQP服务器现在运行的那样)。
谢谢
发布于 2011-06-21 06:55:58
https://stackoverflow.com/questions/3994844
复制相似问题