2

私はrabbitMQでPOCを行っており、2つの数字を追加して応答を得るプログラムを書いています。
キューから値を取得するために書いたコードは無限に実行され (while ループ内)、行 (while ループ内) はキューからデータが取得されるのを待ちます。キューから何かを取得するまで、while ループの次のラウンドには進みません。
無限ループ内で値を取得していることを意味します。そして、この値を次の処理に使用したいと考えています。


while (真)
{                 
      QueueingConsumer.Delivery delivery1;
      試す
      {
            配送 = consumer.nextDelivery();
//上記の行は、配信が何らかの値を取得するまで待機します
            String result1 = new String(delivery1.getBody());
            System.out.println("結果を受け取りました-"+ result1);
       }
       catch (InterruptedException ie)
       {
              継続する;
       }
 } // 終了

問題は、while ループから値を返すことができないことです (無限に実行したい)。
ループが続行され、処理されたデータがループ外でも取得されるようにするにはどうすればよいですか?

4

4 に答える 4

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

ループと同時に処理を行う必要がある場合は、複数のスレッドで作業する必要があり、問題はもう少し複雑になります。

于 2010-09-21T06:45:14.280 に答える
0

戻り値の可視性を高めます。だから、あなたはその価値にアクセスできるようになります

于 2010-09-21T06:26:14.757 に答える
0

関数が複数の値を返すことを可能にするyield機能について言及しているようです。私の知る限り、これは Java ですぐにサポートされるわけではありませんが、この機能を実装しているプロジェクトがいくつかあります。

于 2010-09-21T08:18:13.630 に答える
0

正確にはどういう意味ですか?

同じスレッドにとどまりたい場合は、関数を呼び出すだけです (受信したメッセージを処理してから、次のメッセージを読み取ります)。

並行性が必要な場合 (メッセージを再処理しているかどうかに関係なく、常に読み取ります)、プロデューサー/コンシューマー パターンを使用します。スレッドを 1 つ作成します。

  • MQ から読み取る
  • (スレッドセーフな) コレクションへの投稿
  • シグナル
  • mq からの読み取りに戻ります

少なくとも 1 つの mor スレッドを作成します。

  • 信号待ち
  • (スレッドセーフな) コレクションからメッセージを読み取り (そして削除します)
  • メッセージを処理する
  • 戻って信号待ち

h番目

マリオ

于 2010-09-21T06:23:34.960 に答える