我一直在使用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服务器现在正在运行)
由于