Webサービスからの応答をチェックする必要があるスレッドを60秒間実行する必要があるWebアプリケーションを開発しています。応答が60秒以内に到着すると、私は60秒後にタイムアウトページに転送されます。私はJSF 2.0を使用していますか? 私はタイマーを使用することを考えましたが、私は時間が限られているだけのためにタイマーを動かすことができないと確信しています。Javaでタイマーを使用して特定の時間、ジョブを実行するにはどうすればよいですか?
これにはスマートな解決策がありますか?
Webサービスからの応答をチェックする必要があるスレッドを60秒間実行する必要があるWebアプリケーションを開発しています。応答が60秒以内に到着すると、私は60秒後にタイムアウトページに転送されます。私はJSF 2.0を使用していますか? 私はタイマーを使用することを考えましたが、私は時間が限られているだけのためにタイマーを動かすことができないと確信しています。Javaでタイマーを使用して特定の時間、ジョブを実行するにはどうすればよいですか?
これにはスマートな解決策がありますか?
絶対にこのため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.
}
ご協力いただきありがとうございます – user1220373
しかし、この方法では、応答が早くても60秒間待つ必要があります。 – user1220373
ハァッ!しかし、もしあなたがGoogleの "EE"と "Threads"を使っているのであれば、 "EE/EJBでスレッドを使わないでください!"と言っているページが何十(何百? TimerServiceよりもExecutorフレームワークを推奨したのはなぜですか?私はここで何が欠けていますか? – Marco
はい、一定の時間が経過すると期限切れになるタイマーを作成できます。このリンクhttp://docs.oracle.com/javaee/1.4/api/javax/ejb/TimerService.htmlを参照してください。
Java < vers。 6
注入するのTimerService
@Ressource
TimerService ts;
が重要タイマー
...
// create Timer which starts after 10s every 10s
Timer timer = ts.createTimer(10000, 10000, "Test-Timer");
...
作成します:タイマー間隔は、Javaを参照してください> 7secなければならないが仕様書
時にタイマーが起動すると
@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をご覧ください。
これが役に立った!楽しむ!
これは正確にOPが求めているものではありません。それはHTTPリクエストスレッドで発生する必要があります(それ以外の方法で転送/リダイレクトする方法はありますか?) – BalusC
ループの中に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
;
どのようにWebサービスを呼び、どのように応答が入っていますか? – Perception