2010-10-22 4 views
0

J'utilise EventMachine depuis longtemps et je l'ai vraiment trouvé génial car il me montre beaucoup plus que je n'avais pas à m'inquiéter pour quoi que ce soit. Mais récemment je viens de trouver ça bizarre question que je viens de mal à comprendreEventmachine :: defer + ruby ​​

Voici ce qui est juste dire

J'ai boucle eventmachine qui ressemblent à ce

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

ici mon regard de bloc opération comme (code ci-dessous l'utilisation de AMQP à l'aide gemme de carotte)

@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 

      } 

Voici mon regard bloc de rappel comme

@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  
} 

Maintenant voici les Problème Le code Bien que le travail de la façon dont il devrait jusqu'à quelque chose de mal se Voici ce que je voulais dire

maintenant supposons que je cours ce code ci-dessus

J'ai un nom de file d'attente "my_queue" ou il va créer un si elle n'existe pas la file d'attente est initialement vide

ici la sortie que je reçois sur la console

Initier la file d'attente

La file d'attente est Poping le message

BOO Rien à traiter

Comme j'ai construit le message, la sortie Changer dans la console en conséquence

Maintenant la peine

Si je momentanément arrêt mon serveur AMQP ici la sortie (pour montrer ce que je voulais dire)

Initier la file d'attente

Broken Pipe => erreur qui Caught dans début du bloc de sauvetage dans le bloc d'opération

Démarrer maintenant AMQP serveur

Le code juste ne semblent jamais aller de l'avant de la ligne où il n'y a eu erreur cela signifie que je ne Semblent imprimer la ligne

La file d'attente est Poping le message

non seulement le defer courant pour lequel est nouvelle tentative est arrivé, mais aussi le nouveau bloc d'opération de différé qui est lancé après que le temps du temporisateur vient de s'écouler i.des moyens électroniques de l'appel ultérieur au bloc d'opération ne semblent jamais aller de l'avant et faire du traitement et toujours imprimer la sortie suivante seulement

Initiating the queue 

Tout semble jamais aller de l'avant (bloqué) et faire du traitement que cela signifiait à-dire chercher le message de la file d'attente effectuer le traitement en conséquence et toutes les autres choses (comme le serveur AMQP fonctionne maintenant)

Merci

Répondre

Questions connexes