Webサービスを呼び出すJavaのメソッドがあります。Web サービスが 1 秒以上かかっている場合。時間の。メソッドを強制終了して、プログラム フローを続行できるはずです。
5 に答える
Google Guava のSimpleTimeLimiterは、必要なこと、特にそのcallWithTimeout()
メソッドを実行します。
Executors フレームワークを使用して を呼び出すことをお勧めしますFuture.get(long, TimeUnit)
。その呼び出しを殺すことに関しては、呼び出すことができますFuture.cancel(true)
。もちろん、呼び出しを含む が必要ですsubmit
。Callable
新しいライブラリを追加したくない場合は、Web サービスの呼び出しを別のスレッドに委譲し、1 秒のタイムアウトを使用してそのスレッドに参加することで、これを簡単に実現できます。以下は、これらのタスクを実行する完全なプログラムです。重要なポイントは 2 つあります。
- 非同期スレッドを使用して呼び出しを行い、TimeOut で参加します。さらにデーモンとして設定することもできます。
- 操作からの値を消費する必要がない場合は、非同期スレッドに伝達して、不要な割り当てを行わないようにします。
コード:
public class Main {
String returnVar;
private static final long TIME_OUT=1000;//in mills
private void makeCall() {
WebServiceStubDummy ws = new WebServiceStubDummy();
Boolean timeElapsed = false;
Thread t = new Thread(new AsyncWSCall(ws,timeElapsed));
t.start();
try {
t.join(TIME_OUT);
} catch (InterruptedException e) {}
synchronized (ws) {
timeElapsed=true;
}
System.out.println(returnVar);
}
private class AsyncWSCall implements Runnable{
WebServiceStubDummy ws;
Boolean timeElapsed;
public AsyncWSCall(WebServiceStubDummy ws, Boolean timeElapsed){
this.ws=ws;
this.timeElapsed=timeElapsed;
}
@Override
public void run() {
String myStr = ws.dummyMethod();
//synchronize for shared variable timeElapsed
synchronized (ws) {
if(!timeElapsed){
//if time elapsed don't assign
returnVar=myStr;
}
}
}
}
class WebServiceStubDummy{
public String dummyMethod(){
try {
//Dummy Call: if changed to 2000 value will not be consumed
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "From Dummy Metho";
}
}
/**
* @param args
*/
public static void main(String[] args) {
Main m=new Main();
m.makeCall();
}}
さらに、WebService オブジェクトを渡す方法と WS 操作の結果を割り当てる方法に従って、コードを微調整できます。
SOスレッド「Javaで指定された制限時間後にスレッドを強制終了する」が役立つ場合があります。ExecutorServiceを利用します
Javaでのメソッド実行の時間制限も使用できます。Thread.stopは非推奨になっていることに注意してください。
Thread.stopが非推奨になるのはなぜですか?
それは本質的に危険だからです。スレッドを停止すると、ロックされているすべてのモニターのロックが解除されます。(ThreadDeath例外がスタックに伝播すると、モニターのロックが解除されます。)これらのモニターによって以前に保護されていたオブジェクトのいずれかが不整合状態であった場合、他のスレッドはこれらのオブジェクトを不整合状態で表示する可能性があります。そのような物体は損傷していると言われています。スレッドが損傷したオブジェクトを操作すると、任意の動作が発生する可能性があります。この動作は微妙で検出が難しい場合があります。または、発音される場合があります。他のチェックされていない例外とは異なり、ThreadDeathはスレッドをサイレントに強制終了します。したがって、ユーザーは自分のプログラムが破損している可能性があるという警告はありません。破損は、実際の損傷が発生した後、数時間または数日後でも、いつでも現れる可能性があります。
1 秒のタイムアウトを使用します。あなたのウェブサービスリクエストで。