1

リモートリソースが利用できないためにタスクが長くかかるか、ハングする場合でも、Spring でスケジュールされたタスクをタイムアウトする (スレッドを強制終了する) 方法はありますか?

私の場合、タスクは HtmlUnitDriver (Selenium) の一連のステップに基づいているため、時間がかかりすぎたりハングすることさえありますが、時々ハングするため、スレッドの実行に時間制限を設定できるようにしたいと考えています。 . せいぜい1分くらい。

1 分の初期遅延で 5 分の固定レート実行をセットアップします。

前もって感謝します

4

2 に答える 2

1

私はこの例に従って少し前に同じことをしました:

基本的な考え方は、コードを Callable または Runnable を実装するクラスに配置し、Callable または Runnable クラスをパラメーターとしてスレッドを呼び出す場所に FutureTask を作成することです。executor を定義し、futureTask を executor に送信すると、try catch ブロック内で x 時間スレッドを実行できるようになりました。スレッドが timeoutException で終了すると、時間がかかりすぎたことがわかります。

これが私のコードです:

CallableServiceExecutor callableServiceExecutor = new CallableServiceExecutor();
        FutureTask<> task = new FutureTask<>(callableServiceExecutor);

        ExecutorService executor =  Executors.newSingleThreadExecutor();
        executor.submit(task);

        Boolean exito = true;

        try {

            result = task.get(getTimeoutValidacion() , TimeUnit.SECONDS);

        } catch (InterruptedException e) {
            exito = false;
        } catch (ExecutionException e) {
            exito = false;
        } catch (TimeoutException e) {
            exito = false;
        }

        task.cancel(true);
        executor.shutdown();
于 2013-03-13T17:11:55.943 に答える
0

参照:スレッドをタイムアウトする方法

簡単に言うと、Javaのスレッド実装の制限により、スレッドを強制終了する簡単で信頼できる方法はありません。これExecutorService#shutdown()は一種のハックで重いものです。タスク自体でこれに対処するのが最善です。たとえば、ソケットでタイムアウトするようにREST要求を行う場合のネットワーク要求レベルのように。

または、何らかのメッセージパッシングアラアクターモデル(Akkaを参照)を実行する場合は、アクターが死ぬように「スーパーバイザー」からメッセージを送信できます。また、Nettyのようなものを使用してブロックを回避することも役立ちます。

于 2013-03-13T16:58:43.953 に答える