【发布时间】:2011-04-29 00:48:32
【问题描述】:
我使用 EventMachine 已经有一段时间了,我真的觉得它很棒,因为它管理向我展示了我不必担心任何事情。但最近我发现了这个奇怪的问题,我只是没能解决了解
这里只是告诉你什么
我有 Eventmachine 循环,看起来像这样
EventMachine::run {
EventMachine::add_periodic_timer(10) do
EventMachine::defer(@operation_block,@callback_block)
end
}
这里我的操作块看起来像(下面的代码使用 amqp 使用胡萝卜 gem)
@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 服务器,这里的输出(显示我的意思)
启动队列
Broken Pipe => 发生的错误 在操作块中开始救援块
现在启动 AMQP 服务器
代码似乎永远不会从当前出现错误的行向前移动 这意味着我似乎从来没有打印过这条线
队列正在弹出消息
不仅发生了当前的重试延迟,而且还发生了在 Timer 时间刚刚过去之后启动的新延迟操作块 即后续调用操作块的方法 似乎永远不会继续前进并进行处理并始终打印以下内容 只输出
Initiating the queue
似乎永远不会前进(卡住)并进行处理,即从队列中获取消息并相应地进行处理,并且所有其他内容(因为 AMQP 服务器现在正在运行)
谢谢
【问题讨论】:
标签: ruby eventmachine