2010-09-21 97 views
2

我正在用rabbitMQ做一个POC并编写一个程序来添加两个数字并获得响应。
我们为从队列中检索值而编写的代码正在无限期地运行(在while循环中),并且一行(在while循环中)等待某些数据从队列中检索;直到它从队列中获得某些东西,它将不会进入while循环的下一轮。
意味着我们正在获取无限循环内的值。 我想用这个值来进行下一步处理。从循环中返回值


 
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 

问题是,我不能够从while循环返回值(我要运行它无限时间)。
我该怎么做,这样循环会继续,我也会得到外部循环处理的数据呢?

回答

1

如果'处理结果'是一个快速完成的操作,那么就直接进行内联操作。通过调用一个单独的函数来完成实际的处理:

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

如果您需要处理与循环同时发生,那么你就需要多线程工作,这个问题变得更加复杂。

0

你究竟是什么意思?

如果你想留在同一个线程中,只需调用一个函数(处理收到的一条消息,然后读取下一条消息)。

如果您需要并发(总是读取,无论您是否重新处理消息),请使用生产者/消费者模式。 创建一个线程

  • 从MQ读取
  • 职位成(线程安全的)集合
  • 信号是
  • 追溯到从MQ读取

创建于至少一个mor线程

  • 等待信号
  • 读取(和删除)从(线程安全的)集合
  • 过程中的消息
  • 追溯到等待信号

心连心

马里奥

0
消息

使您的返回值具有更高的可视性。 因此,您将可以访问它的值

0

这听起来像你指的yield特性,它允许你的函数返回多个值。据我所知,这不是Java支持的开箱即用,但有一些projects可用实现此功能。