2010-10-22 64 views
0

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

由于

回答