0

しばらく @Scheduled でスプリング ブートを使用していましたが、最近、次のように危険な潜在的な脅威があることがわかりました。これは、「kill -3」によってスレッド スタック トレースに表示されます。この問題につながる可能性のあるものをすべてクリアするために、完全にダミーのタスクを作成します。

    @Component
public class TestJob
{
    /**
     * LOGGER
     */
    private static Logger log = LogManager.getLogger(TestJob.class);

    @Scheduled(fixedDelay = 60000, initialDelay = 1000)
    public void test()
    {
        log.info("---------------[{}]", Thread.currentThread().getId());
    }
}

これは私のログです:

20151102 11:54:50.660 | 情報 | プール-3-スレッド-2 | ---------------[26] | TestJob.test(TestJob.java:19) 20151102 11:55:50.662 | 情報 | プール-3-スレッド-4 | ---------------[28] | TestJob.test(TestJob.java:19) 20151102 11:56:50.664 | 情報 | プール-3-スレッド-5 | ---------------[33] | TestJob.test(TestJob.java:19) 20151102 11:57:50.666 | 情報 | プール-3-スレッド-6 | ---------------[37] | TestJob.test(TestJob.java:19)

スレッドスタックトレース:

"pool-3-thread-2" #26 prio=5 os_prio=0 tid=0x00007fbea0cd9800 nid=0x74f2 条件 [0x00007fbf0d3d2000] で待機中 java.lang.Thread.State: sun.misc.Unsafe.park で待機中 (パーキング)( Native Method) - java.util.concurrent で <0x0000000763ed3710> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) を待機するパーキング (java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) で) .locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) で java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088) で java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkcutor.take(ScheduledThreadPool.java :809) java.util.concurrent.ThreadPoolExecutor で。getTask(ThreadPoolExecutor.java:1067) で java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) で java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) で java.lang.Thread .run(Thread.java:745)

"pool-3-thread-4" #28 prio=5 os_prio=0 tid=0x00007fbea0783800 nid=0x74f4 条件 [0x00007fbf0d1d0000] で待機中Native Method) - java.util.concurrent で <0x0000000763ed3710> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) を待機するパーキング (java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) で) .locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) で java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088) で java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkcutor.take(ScheduledThreadPool.java :809) java.util.concurrent.ThreadPoolExecutor で。getTask(ThreadPoolExecutor.java:1067) で java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) で java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) で java.lang.Thread .run(Thread.java:745)

スケジュールされたjavadocは言う

@Scheduled アノテーションの処理は、ScheduledAnnotationBeanPostProcessor を登録することで実行されます。

私はこのクラスに自分で名前を付けていません。

この問題を解決する方法を知っている人はいますか?

アップデート: Eclipse デバッグ画面キャプチャの写真を添付し​​ました。プールが増加し、すべての古いスレッドが実行されています...私の質問が明確になることを願っています。

Eclipse デバッグ画面キャプチャの写真を添付し​​ました。プールが増加し、すべての古いスレッドが実行されています...私の質問が明確になることを願っています。

更新: 今回はうまくいったと思います。Spring Boot スケジューラのデフォルトのプール サイズは 100 で、すべてのスレッドが実行中の状態です。私は本当にそれを理解していません。何を実行していますか?何かを待つべきだと思いますが、なぜですか?アノテーションを使用してSpring Bootのスケジュールされたプールサイズを設定する方法を知っている人はいますか? 私は自分のアプリケーションで xml を使用しておらず、スケジューラーのためだけに導入するつもりはありません。

4

1 に答える 1

1

あなたの例では、絶対に正常な動作が見られます。タスクをスケジュールしました。これは、スレッド プール内の別のスレッドによって毎分実行されます。スレッド プール内のスレッドは、スレッド プールに予期される待機 (パーキング) 状態にあります。スレッドの数を減らしたい場合は、次のように構成できます: http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/htmlsingle/#scheduling

<task:scheduler id="scheduler" pool-size="2"/>
于 2015-11-02T07:34:23.813 に答える