2016-10-28 7 views
1

私はマルチスレッドサーバを作成しています。クライアント要求を処理し、完了したらクライアントに戻す必要があります。同時実行性:コードの共通ブロックが完了するまで待ちます。

私は、ペイロードを共通キューに渡す同時クライアント接続オブジェクトのリストを持っています。キューを通過した後、ペイロードはサーバーによって処理され、応答が生成されます。

問題は、サーバーに処理が完了したことをクライアントに通知する方法がわかりません。

これは、ペイロードが以前にクライアントスレッドによってロードされたBlockingQueueの、され、クライアントのペイロードを扱うスレッドです:同時に

Thread messageHandling = new Thread() { 
     public void run(){ 
      while(true){ 
       try{ 
        Object payLoad= payLoads.take(); 
        // Do some handling       
        // SEND REPLY BACCK TO THE CLIENT 
       } 
       catch(InterruptedException e){ } 
      } 
     } 
    }; 

は、クライアント側で、次のことが起こっている:

を私は問題を抱えてい場所
{ 
    ... 
payloads.add(payLoad) 
/// Sleep until the server is done doing its logic with the payload 

}

コメントビットです。私はクライアントスレッドがリクエストが処理されるまで待つメカニズムをどのように実装すればいいのか分かりません。いったんクライアントに返信を返す方法がわかりません。

私は消費者/プロデューサの問題を見て、待っている/通知するメカニズムなどを調べていますが、何もこの特定の問題に似ているようではありません。

ご協力いただければ幸いです。

+0

*「私の理解によれば、多くのクライアントが利用可能なジョブを引き出し、結果を報告する必要がある間に、ジョブを保持して結果を収集するインスタンス(サーバー) 、 右? –

+0

これは正しい – Dragan

+0

OK、 "dispatcher"オブジェクトには2つのメソッド、 'take()'メソッド、コードには 'report(JobResult jr)'のような結果を返すメソッドが必要です。あなたがすでに持っているようにクライアントは仕事を得ます。彼らが終了したら、彼らは結果を報告し、 "ディスパッチャー"オブジェクトは結果とジョブとを一致させ、結果と関係があるものを実行しなければならない。 –

答えて

1

payloadsにペイロードの横にクライアント接続情報を保存する必要があります。

2つのフィールドを持つクラスを作成します。そのうちの1つはペイロードになり、もう1つはクライアントの識別を可能にするものです。

あなたの// SEND REPLY BACCK TO THE CLIENTでは応答を送信するだけです。待つ必要はありません/// Sleep until the server is done doing its logic with the payload

あなたはクライアントと通信する方法を知らずに、私はあなたに良い答えを与えることはできません。

ソケットを使用する場合は、「クライアントを識別できるもの」がソケットインスタンスになります。

SynchronousQueueを使用します。

// SEND REPLY BACCK TO THE CLIENTにはあなたの回答が記載されています。

/// Sleep until the server is done doing its logic with the payloadで応答します(応答がバッファに入るまでブロックされます)。

以前のアプローチと同じ方法でペイロード付きバッファを通過させます。

+0

ありがとう、これは理にかなっています。だから、この場合、クライアントスレッドで待機する必要はありません。ソケットは、作業が完了したら、サーバーメソッドに書き込まれ、閉じられます。 – Dragan

+0

はい。最初のアプローチはスレッドの読み取りをブロックしないため、より優れています。 – talex

関連する問題