2010-09-21 3 views
2

Je fais un POC avec le rabbitMQ et j'écris un programme pour ajouter deux nombres et obtenir la réponse.
Le code que nous avons écrit pour extraire la valeur de la file d'attente s'exécute à l'infini (dans une boucle while) et une ligne (dans la boucle while) attend que certaines données soient extraites de la file d'attente; jusqu'à ce qu'il reçoive quelque chose de la file d'attente, il ne passera pas au tour suivant de la boucle while. Signifie que nous obtenons la valeur dans une boucle infinie. Et je veux utiliser cette valeur pour mon prochain traitement.Retour de la valeur à partir de la boucle


 
while (true) 
{     
     QueueingConsumer.Delivery delivery1; 
     try 
     { 
      delivery = consumer.nextDelivery(); 
//The above line waits until delivery get some value 
      String result1 = new String(delivery1.getBody()); 
      System.out.println("Result received-"+ result1); 
     } 
     catch (InterruptedException ie) 
     { 
       continue; 
     } 
} // end while 

problème est que je ne suis pas en mesure de retourner la valeur de la boucle while (je veux exécuter un temps infini).
Comment puis-je faire cela pour que la boucle continue et que j'obtienne aussi les données traitées en dehors de la boucle?

Répondre

1

Si le 'traitement du résultat' est une opération qui se termine rapidement, il suffit de le faire en ligne, par ex. en appelant une fonction distincte qui fait le traitement proprement dit:

void mainLoop() 
{ 
    while (true) 
    {     
     QueueingConsumer.Delivery delivery1; 
     try 
     { 
      delivery = consumer.nextDelivery(); 
      //The above line waits until delivery get some value 
      String result1 = new String(delivery1.getBody()); 
      System.out.println("Result received-"+ result1); 
      processResult(result1); 
     } 
     catch (InterruptedException ie) 
     { 
      continue; 
     } 
    } // end while 
} 

void processResult(String result) 
{ 
    // Do whatever needs to be done with 'result' 
} 

Si vous avez besoin de traitement de se produire en même temps que la boucle, alors vous aurez besoin de travailler avec plusieurs threads et le problème devient un peu plus compliqué.

0

Qu'entendez-vous exactement par là?

Si vous souhaitez rester dans le même thread, appelez simplement une fonction (travaillez sur le message reçu et lisez le suivant).

Si vous avez besoin d'accès simultané (toujours lu, que vous traitiez ou non un message), utilisez un modèle producteur/consommateur. Créer un fil qui

  • lit du mq
  • messages dans un (thread-safe) collection
  • signaux qui
  • remonte à lire à partir du mq

Créer à au moins un fil de mor que

  • attend le signal
  • lit (et supprime) message du processus de collecte
  • (thread-safe) le message
  • remonte à attendre le signal

HTH

Mario

0

Rendez votre valeur de retour plus visible. Ainsi, vous aurez accès à sa valeur

0

Il semble que vous faites référence à la fonction de rendement qui permet à votre fonction de retourner plusieurs valeurs. Pour autant que je sache, cela n'est pas pris en charge par Java, mais il existe quelques projects qui implémentent cette fonctionnalité.

Questions connexes