Возврат значения из цикла - PullRequest
       8

Возврат значения из цикла

2 голосов
/ 21 сентября 2010

Я делаю POC с rabbitMQ и пишу программу для добавления двух чисел и получения ответа.
Код, который мы написали для извлечения значения из очереди, выполняется бесконечное время (в цикле 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 (я хочу запускать его бесконечное время).
Как я могу это сделать, чтобы цикл продолжился, и я получу обработанные данные также вне цикла?

Ответы [ 4 ]

1 голос
/ 21 сентября 2010

Если «обработка результата» - это операция, которая выполняется быстро, просто сделайте это в строке, например, вызывая отдельную функцию, которая выполняет фактическую обработку:

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 голосов
/ 21 сентября 2010

Похоже, вы имеете в виду функцию yield, которая позволяет вашей функции возвращать несколько значений.Насколько я знаю, это не поддерживается в Java, но есть несколько проектов , которые реализуют эту функцию.

0 голосов
/ 21 сентября 2010

Сделайте возвращаемое значение более заметным.Таким образом, вы получите доступ к его значению

0 голосов
/ 21 сентября 2010

Что именно вы подразумеваете под этим?

Если вы хотите остаться в той же ветке, просто вызовите функцию (работайте над одним полученным сообщением и затем читайте следующее).

Если вам нужен параллелизм (всегда читайте, независимо от того, обрабатываете ли вы сообщение или нет), используйте шаблон «производитель / потребитель». Создайте один поток, который

  • читает из mq
  • сообщений в (поточно-безопасной) коллекции
  • сигнализирует, что
  • возвращается к чтению из mq

Создайте хотя бы один поток, который

  • ждет сигнала
  • читает (и удаляет) сообщение из (поточно-ориентированной) коллекции
  • обработать сообщение
  • возвращается к ожиданию сигнала

НТН

Mario

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...