1

現在、JavaでRestfullアーキテクチャでアプリケーションを開発中です。ウェブレストサービス、別のWebサービスソープ、アンドロイドクライアントとのやりとり中に非常に大きな問題に遭遇しました。Javaでの非同期プロセスのための技術と設計

いくつかのテストの後、クライアントが処理中にエラーを返すことがあり、上記の2つのサービス間でサービスを消費するために同じエラーが発生したことがわかりました。

この問題を解決するには、次のようにします。 クライアントがサーバーに操作を送信すると、サーバーはすぐに要求が行われたと応答します。その後、顧客は、その旨をユーザに通知するまで、毎回自分の操作状況をテストしなければならない。

私の懸念は、私はそれのためだけのスレッドを作成することです。しかし、私はそれのための良いデザインと技術を見つけることができません...あなたの助けを前にありがとう。

+0

あなたのクライアントを非同期に作成し、あなたの実際の問題を解決することができます。しかし、双方向サービス(例えば、リクエストがキューに入れられている、または応答が非常に長い時間がかかっているなど)を主張する場合は、クライアントに通知サービスを公開してサーバーの操作結果を受け取って、以前に送信された要求に対する応答通知。このシナリオでは、両端は技術的にクライアントとサーバーですが、クライアントをイニシエータにコールし続けます。 – acelent

+0

私の問題にご関心をお寄せいただきありがとうございます。あなたが私に提案している2つのソリューションに関して、私は最初のソリューションを実装しました。 2番目はプロジェクトの別の反復の対象となります、この反復は研究と開発を構成します – FiokoSoft

答えて

0

実行メソッド内のステータスを更新しながら、コンシューマスレッドにgetStatusメソッドを実装させて、ステータスをポーリングするクライアントからの呼び出しをリッスンします。消費者のスレッドについて、粗製の実装は、次のようになります。

public class ConsumerThread implements Runnable{ 
    private int status = 0; 
    private Random rand = new Random(); 
    private final CountDownLatch startSignal; 

    public ConsumerThread(CountDownLatch latch){ 
     this.startSignal = latch; 
    } 

    public int getStatus() { 
     return status; 
    } 

    private void setStatus(int status) { 
     this.status = status; 
    } 

    public void run() { 
     try { 
      this.startSignal.await(); 
      while (true){ 
       this.setStatus(rand.nextInt(10)); 
      } 
     } catch (InterruptedException e1) { 
      e1.printStackTrace(); 
     }  
    } 
} 

次に簡単なmainメソッド(私が同時に始まるすべての私のスレッドを持っているCountDownLatchを実装し、それは必須ではありません)しよう:

public class ThreadMain{ 
    private static List<ConsumerThread> consumers = new ArrayList<ConsumerThread>(); 

    public static void main(String[] args) { 
     int NUM_THREAD = 15; 
     ExecutorService executor = Executors.newFixedThreadPool(NUM_THREAD); 

     CountDownLatch latch = new CountDownLatch(NUM_THREAD); 
     ConsumerThread buffer = new ConsumerThread(latch); 
     for (int i = 0; i < NUM_THREAD; i++){ 
      consumers.add(buffer); 
      executor.execute(buffer); 
      latch.countDown(); 
      buffer = new ConsumerThread(latch); 
     } 

     for (int i = 0; i < 100; i++){ 
      System.out.println("Status for Thread 0: " + getStatusId(0)); 
      System.out.println("Status for Thread 14: " + getStatusId(14)); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public static int getStatusId(int index){ 
     return consumers.get(index).getStatus(); 
    } 
} 

出力例:

Status for Thread 0: 5 
Status for Thread 14: 0 
Status for Thread 0: 7 
Status for Thread 14: 2 
Status for Thread 0: 7 
Status for Thread 14: 4 
Status for Thread 0: 6 
Status for Thread 14: 3 
+0

あなたの資産のおかげで、私は私の問題を解決しました – FiokoSoft

+0

@FiokoSoft問題はありません。解決された問題。 – Adonis

関連する問題