我一直在使用EventMachine已经有一段时间了,而且我真的发现它很棒,因为It Manage显示了更多我不需要担心任何事情。但最近我发现这个奇怪的问题,我只是失败了明白
这里只是告诉
我有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”,如果它不存在,它将创建一个队列最初为空
这是我在控制台上获得的输出
启动队列
队列正在弹出消息
BOO无需处理
正如我在消息中相应地根据
构建了控制台中的输出更改现在麻烦
如果我暂时关闭我的AMQP服务器这里输出(显示我的意思)
启动队列
断管=>抓到的错误 在操作块中开始救援块
现在启动AMQP服务器
该代码似乎永远不会从目前出错的行开始 这意味着我似乎永远不会看到打印线
队列正在弹出消息
不仅发生重试的当前延迟发生,而且在定时器时间刚刚过去后启动的新延迟操作块也是如此 即后续调用操作块的方法 似乎永远不会前进并进行处理并始终打印以下内容 仅输出
Initiating the queue
似乎永远不会前进(卡住)并且执行处理它意味着从队列中获取消息并相应地处理所有其他事情(因为AMQP服务器现在正在运行)
谢谢
答案 0 :(得分:0)