2017-03-05 16 views
-3

私はJava 8でコーディングしており、JPAを使用してさらに処理するためにHTTPリクエストを介して取得するデータを持っています。 JPA(EclipseLink)が逐次処理を必要とするため、処理が失敗するマルチスレッドの考え方。 REST-テンプレートでHTTPリクエストがcontent=response.getBody().getDataChunk()のようなものは、単一のHTTPリクエストを取得して取得され、約50-70ms、が、約1.000s要求の照会をとる==>プールと順次処理を使用したマルチスレッド

  1. スタート時のHTTPをたくさんかかりますマルチスレッド
  2. 保存-queryingクエリ -
  3. スタック内の最も可能性が高いが、スタックから単一のデータ要素を取得し、プロセスは

しかし、私は詳細をコーディングする方法について見当もつかない。つまり、スタックとしてどのようなオブジェクトを使うべきですか?どのようにステップ3の進行中の処理を開始するには? Thread.join()?さらに、複数のスレッドの量をどのように制限するか。 2または3? ExecutorService.newCachedPool(3)(またはそれに類するもの)Hmmm ...

正しく行う方法は?この特定のパターンのリンクはありますか?

+0

ようこそスタックオーバーフロー!私たちはQ&Aサイトであり、雇用者向けサービスではありません。これまでに何を試みたのか、それがうまくいかなかった理由を説明してください。参照:[なぜ誰かが私を助けることができますか?実際の質問ではありませんか?](http://meta.stackoverflow.com/q/284236) –

+0

あなたの投稿が何を意味するのかはっきりしていません。これは標準ですか、これはすでに私のqに適用されますか?もしそうなら、私はあなたが見たいものが不思議です。私はシーケンシャルなコードしか持っていませんが、マルチスレッドコードにカプセル化する方法はわかりません。プラス私はデザインパターンに興味があります... – LeO

+0

私はそれが適切であると感じたので私はあなたの質問にこれを置く。私はそれが明確にされる必要があることを明確にすると思うので、リンクをお読みください。 –

答えて

0

私は最近、これを達成するために次のようなコードを使用しました。私はあなたがあなたのために働くためにそれを適応させることができると確信しています

ExecutorService executor = Executors.newCachedThreadPool() 
List<MyType> results = urls.stream().map((String url)->executor.submit(()-> { 

     return url.substring(2); // retrieve the page and do something with it 

    })) 
    .collect(Collectors.toList()) // this makes sure all urls are submitted before processing the results 
    .stream().map(future -> { 
     try { 
      return future.get(); 
     } catch (InterruptedException | ExecutionException e) { 
      e.printStackTrace(); 
      return "failed"; // or some other value indicating failure 
     } 
    }).collect(Collectors.toList(); 

これは、複数のスレッドを並行して実行するためのエグゼキュータサービスを最初に作成することによって機能します。その後、URLのリストを取得し、それぞれをexecutorに送信して、上位ラムダで処理されます。

この後、すべての結果を収集し、Futureのオブジェクトを実際の値の下のラムダに変換します。

+0

私はあなたが 'Executor'によって要求を提出していることを理解しています - すべての並行して、最後の' .collect(Collectors.toList()) 'によって' future'を結果にマップします。これは、結果を単純に '.foreach(...)'で繰り返すことができるということですか? 'future.get()'でいっぱいになってしまうのですが、 '.foreach(..)は反復処理中にいくつかのExcpetionsに変更が加えられませんか? – LeO

+0

@LeOあなたが何を求めているのか分かりません。私は自分の答えを編集しました - 最初の収集の後のコメントを見てください。この最初の収集は、あなたの '未来'の 'リスト'を提供します。それらを上書きしたり、残りのコードを使用して実際の結果値の 'List'に変換することができます。 – Nulano

関連する問題