2012-03-08 2 views
0

Webサービスからの応答をチェックする必要があるスレッドを60秒間実行する必要があるWebアプリケーションを開発しています。応答が60秒以内に到着すると、私は60秒後にタイムアウトページに転送されます。私はJSF 2.0を使用していますか? 私はタイマーを使用することを考えましたが、私は時間が限られているだけのためにタイマーを動かすことができないと確信しています。Javaでタイマーを使用して特定の時間、ジョブを実行するにはどうすればよいですか?

これにはスマートな解決策がありますか?

+1

どのようにWebサービスを呼び、どのように応答が入って​​いますか? – Perception

答えて

1

絶対にこのためTimerを使用しないでください! 1回限りのデスクトップアプリケーションでは面白いですが、永久に稼働するJava EE Webアプリケーションで使用すると、潜在的な問題が深刻になります。

代わりにthe java.util.concurrent packageのエグゼキュータを使用してください。キックオフの例は次のとおりです。

ExecutorService executor = Executors.newSingleThreadExecutor(); // An application wide thread pool executor is better. 

Callable<InputStream> task = new Callable<InputStream>() { 
    @Override 
    public InputStream call() throws Exception { 
     // Do here your webservice call job. 
     return new URL("http://stackoverflow.com").openStream(); 
    } 
}; 

try { 
    InputStream input = executor.invokeAny(Arrays.asList(task), 60, TimeUnit.SECONDS); 
    // Successful! Forward to success page here. 
} catch (TimeoutException e) { 
    // Timeout occurred. Forward to timeout page here. 
} 
+0

ご協力いただきありがとうございます – user1220373

+0

しかし、この方法では、応答が早くても60秒間待つ必要があります。 – user1220373

+0

ハァッ!しかし、もしあなたがGoogleの "EE"と "Threads"を使っているのであれば、 "EE/EJBでスレッドを使わないでください!"と言っているページが何十(何百? TimerServiceよりもExecutorフレームワークを推奨したのはなぜですか?私はここで何が欠けていますか? – Marco

6

はい、一定の時間が経過すると期限切れになるタイマーを作成できます。このリンクhttp://docs.oracle.com/javaee/1.4/api/javax/ejb/TimerService.htmlを参照してください。

Java < vers。 6

  1. セッション - またはメッセージ駆動-豆
  2. 注入するのTimerService

    @Ressource 
    TimerService ts; 
    
  3. が重要タイマー

    ... 
    // create Timer which starts after 10s every 10s 
    Timer timer = ts.createTimer(10000, 10000, "Test-Timer"); 
    ... 
    

    作成します:タイマー間隔は、Javaを参照してください> 7secなければならないが仕様書

  4. 時にタイマーが起動すると

    @Timeout //marks Method to be executed by Timer 
    public void timerFired(Timer timer) { 
        // your code here 
    } 
    

ジャワ> VERS実行するメソッドを作成します。 6

@Schedule -annotation

@Schedule(second="*/45", minute="*", hour="*", persistent="false") 
    public void scheduler() { 
     // your code here 
    } 

上記のコードを持つ多くの快適は毎時毎分ごとに45秒を発射しますタイマーを実装しています。 cron構文の詳細については、wikipediaを参照してください。

どちらのメソッドもSerializable -Interfaceを実装しているため、どちらもスレッドセーフです。

この基本的な機能を拡張したい場合は、Quartzをご覧ください。

これが役に立った!楽しむ!

+0

これは正確にOPが求めているものではありません。それはHTTPリクエストスレッドで発生する必要があります(それ以外の方法で転送/リダイレクトする方法はありますか?) – BalusC

0

ループの中に60秒間座って、チェックの間に1秒間スリープする必要があるようです。 60秒が経過するか要求が到着すると、コードは継続され、ユーザーは適切なページに転送されます。

これは最も簡単な方法です。カウントダウンでユーザーインターフェイスを更新できるので、ユーザーフレンドリーなajaxポーリングシステムを使用することもできます。

 long startTime = System.currentTimeMillis(); 
     boolean success = false; 
     while (System.currentTimeMillis() < startTime + 60000) { 
      // do check 
      success = checkSucceeds(); 
      if (success) break; 

      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException interruptedException) { 
       // ignore 
      } 
     } 
     if (success) 
      // forward to success page 
      ; 
     else 
      // forward to error page 
      ; 
関連する問題