この関数の周りにラッパーを記述して、関数がx ms/secで処理を完了しないと中断された例外をスローする方法を提案できますか?
これはできません。 InterruptException
は特定のメソッドによってのみスローされます。確かにthread.stop()
と呼ぶことができますが、これは推奨されておらず、いくつかの理由で推奨されていません。
あなたのコードが一定時間応答を待つだけで、うまくいかない場合は、呼び出しを放棄する方がよいでしょう。たとえば、Callable
を実際に「第三者内部ライブラリ」を呼び出すスレッドプールに送信できます。その後、メインコードは特定のタイムアウトを持つを実行します。
// allows 5 JMS calls concurrently, change as necessary or used newCachedThreadPool()
ExecutorService threadPool = Executors.newFixedThreadPool(5);
...
// submit the call to be made in the background by thread-pool
Future<Response> future = threadPool.submit(new Callable<Response>() {
public Response call() {
// this damn call can take 3 to 3000ms to complete dammit
return thirdPartyInternalLibrary.makeJmsRequest();
}
});
// wait for some max amount of time
Response response = null;
try {
response = future.get(TimeUnit.MILLISECONDS, 100);
} catch (TimeoutException te) {
// log that it timed out and continue or throw an exception
}
この方法の問題点は、あなたがコントロールの上の多くを持っていないリモートのJMSの問い合わせに対応するためのライブラリを待っているスレッドの全体の束を生む可能性があるということです。
簡単な解決策はありません。
は、スレッドを使用してメソッドを呼び出すと、時間のX量の後にスレッドを殺しますか? –
彼は同期していると言っています...それは簡単ではありません...タイムアウトをサポートしていない場合は、ライブラリ自体のコードを変更する必要があります。 –
Executorsインタフェースを見て、あなたの関数を別のスレッドで起動して、waititterminationのような時間制限メソッドを使用してください。詳細はこちら:https://docs.oracle。 – jaroslawj