2012-01-23 34 views
2

下記を参照してください。java実装:Webサービスをポーリングする

要件:Webサービスをポーリングします。 max_timeout、polling_intervalのポーリングに関する2つの重要なパラメータが、プロパティファイルで設定されます。全体的な目的は、全体的な時間を費やして回答を得ることです。 max_timeoutで応答を受け取った場合、クライアントに応答を返すことができます。それ以外の場合は、操作が失敗したというエラーが表示されます。

以下は、私が書いたコードスニペットです。

int maxTimeOut = 10; 
int interval = 2; 

int iterations = maxTimeOut/interval; 
boolean success = false; 

for (int i = 0; i < iterations; i++) 
{ 
    System.out.println("Number of iteration = " + i); 
    try 
    { 
     Thread.sleep(interval * 1000); 
     System.out.println("Waited for " + interval + " seconds"); 

     success = getWSResponse(i); 
     System.out.println("CALL" + ((success) ? "SUCCESSFUL" : "FAIL")); 

     if(success) break; 

    }catch (InterruptedException ie) 
    { 
     System.out.println(ie.getMessage()); 
    } 
} 

//Send the success flag to client 

これがポーリングの適切な実装である場合は、私を修正してもらえますか?このコードでは、webservice呼び出しがすぐに返ってくることを前提としているとは少しは心配しています。これに2〜3秒かかる場合(通常はそうです)、POLLINGだけでmax_timeout以上を費やしています。どうすればこの問題を解決できますか?これ以上のアプローチはありませんか?

+1

catch(InterruptedException ie){System.out.println(ie.getMessage()); } '...しないでください。ただそれを投げ直してください。{{new runtimeException(ie)} 'を投げてください。 – artbristol

+0

あなたの提案に感謝してくれたartbristol。 SOPではなくRTEをスローするようにこのコードを変更します。 –

答えて

1

ポーリングの場合は、Webサービスが起動して実行中であることを意味します。ポーリングコードでは、(接続タイムアウトを使用して)Webサービスへの接続を試みることができます。接続が成功した場合、 。

HttpURLConnection connection = null; 
URL url = new URL("URL"); 
connection = (HttpURLConnection) url.openConnection(); 
connection .setConnectTimeout(timeout);//specify the timeout and catch the IOexception 
connection.connect(); 

EDIT代わり

、あなたはタイムアウトとタスクで(java.util.concurrent.ExecutorServiceを参照)executorを使用してWebサービスを呼び出すことができますし、それに応じて決めることができます。サンプル:

// Make the ws work a time-boxed task 
      final Future<Boolean> future= executor.submit(new Callable<Boolean>() {   
       @Override 
       public Boolean call() throws Exception { 
        // get ws result 
         return getWSResponse(); 
       } 
      }); 
try { 
       boolean result = future.get(max_wait_time, TimeUnit.SECONDS); 
      } catch (TimeoutException te) { 
throw e; 
} 
+0

Nrj、実際には、大きなxmlを返すWebサービスのメソッドを呼び出す必要があります。解析する必要があり、応答が「成功」か「中断」かを調べます。この全部は、上記のgetWSResponse **呼び出しで抽象化されています。目的は接続性をチェックすることではありません。 –

+1

私の編集を参照してください。これは助けてください – Nrj

+0

ありがとうNrjのコードスニペット。私はそれを試してみましょう。 –

2

はあなたが指定された遅延時間にポーリングするHttpURLConnection -TimeoutとScheduledExecutorServiceの使用を組み合わせることができます - そしてそれはどんな時間がかかった場合、タスクを中止します。

+0

光がありがとう。このシナリオが適切に記述されているサンプルコード/ URLを渡すことができますか?ところで、私が付いているコードスニペットに問題がありますか(指定した問題以外) –

+1

あなたのコードの1つの問題が中断します。中断されたフラグを伝播したり、中断された例外をスローしたりしないためです。 –

関連する問題