代码之家  ›  专栏  ›  技术社区  ›  Viren

eventmachine::defer+ruby

  •  0
  • Viren  · 技术社区  · 14 年前

    我使用EventMachine已经有一段时间了,我真的发现它很棒,因为它能让我看到更多我不必担心的事情。但是最近我发现了这个奇怪的问题,我就是不明白。

    这是刚刚说的

    我有EventMachine循环,看起来像这样

     EventMachine::run {     
        EventMachine::add_periodic_timer(10) do
             EventMachine::defer(@operation_block,@callback_block)
        end
     } 
    

    在这里,我的操作块看起来像(下面的代码使用CarrobGem使用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      
     }
    

    现在麻烦来了 尽管代码按它应该的方式工作,直到发生错误为止。 我的意思是

    现在假设我运行上面的代码

    我有一个队列集名称“我的队列”,或者如果它不存在,它将创建一个队列。队列最初是空的。

    这里是我在控制台上得到的输出

    启动队列

    队列正在弹出消息

    boo没有要处理的内容

    当我消息生成时,控制台中的输出将根据

    现在麻烦来了

    如果我在这里暂时关闭AMQP服务器,输出(显示我的意思)

    启动队列

    管道断开=>陷入错误 在操作块中开始救援块

    现在启动AMQP服务器

    代码似乎从未从当前出错的行向前移动。 这意味着我似乎从来没有打印过这行

    队列正在弹出消息

    不仅发生了重试的当前延迟,而且新的延迟操作块在计时器时间刚过之后启动。 即随后调用操作块的方式 似乎从来没有向前推进,做处理,总是打印以下内容 仅输出

    Initiating the queue
    

    似乎从来没有向前移动(卡住)并做它打算做的处理,即从队列中提取消息,相应地做处理,以及所有其他事情(因为amqp服务器现在正在运行)。

    谢谢

    1 回复  |  直到 11 年前