しばらく @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 デバッグ画面キャプチャの写真を添付しました。プールが増加し、すべての古いスレッドが実行されています...私の質問が明確になることを願っています。
更新: 今回はうまくいったと思います。Spring Boot スケジューラのデフォルトのプール サイズは 100 で、すべてのスレッドが実行中の状態です。私は本当にそれを理解していません。何を実行していますか?何かを待つべきだと思いますが、なぜですか?アノテーションを使用してSpring Bootのスケジュールされたプールサイズを設定する方法を知っている人はいますか? 私は自分のアプリケーションで xml を使用しておらず、スケジューラーのためだけに導入するつもりはありません。