Spring Boot计划的任务挂起

西蒙

我一直在使用带有@Scheduled的spring boot,但是最近我发现存在潜在的危险威胁,如下所述:我发现当应用程序运行和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 | 信息| pool-3-thread-2 | --------------- [26] | TestJob.test(TestJob.java:19)20151102 11:55:50.662 | 信息| pool-3-thread-4 | --------------- [28] | TestJob.test(TestJob.java:19)20151102 11:56:50.664 | 信息| pool-3-thread-5 | --------------- [33] | TestJob.test(TestJob.java:19)20151102 11:57:50.666 | 信息| pool-3-thread-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(处等待)本机方法)-停放以等待java.util.concurrent上的<0x0000000763ed3710>(java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject)在java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) java.util.concurrent.ScheduledThreadPoolExecutor $ DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088)上的.locks.AbstractQueuedSynchronizer $ ConditionObject.await(AbstractQueuedSynchronizer.java:2039)在java.util.concurrent.ScheduledThreadPoolExecutortake(SchedledThreadPoolExecutor $ DelayedWorkQueue :809),位于java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067),位于java.util.concurrent。ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)at java.lang.Thread.run(Thread.java:745)

“ pool-3-thread-4”#28 prio = 5 os_prio = 0 tid = 0x00007fbea0783800 nid = 0x74f4等待条件[0x00007fbf0d1d0000] java.lang.Thread.State:在sun.misc.Unsafe.park(处于等待状态)本机方法)-停放以等待<0x0000000763ed3710>(java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)处的java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject) java.util.concurrent.ScheduledThreadPoolExecutor $ DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088)上的.locks.AbstractQueuedSynchronizer $ ConditionObject.await(AbstractQueuedSynchronizer.java:2039)在java.util.concurrent.ScheduledThreadPoolExecutortake(SchedledThreadPoolExecutor $ DelayedWorkQueue :809),位于java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067),位于java.util.concurrent。ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)at java.lang.Thread.run(Thread.java:745)

预定的Javadoc说

@Scheduled批注的处理是通过注册ScheduledAnnotationBeanPostProcessor来执行的。

我自己没有给这个类命名,仅使用带注释的@EnableScheduling主类。

有人知道如何解决此问题吗?

更新: 我附上一张Eclipse调试屏幕截图的图片,该池正在增加并且所有旧线程都在运行...希望它可以澄清我的问题。

我附上一张Eclipse调试屏幕截图的图片,该池正在增加并且所有旧线程都在运行...希望它可以澄清我的问题。

更新:我想这次我做对了。Spring Boot Scheduler的默认池大小为100,并且所有线程都处于运行状态。我真的不明白,在什么上运行?我认为应该等待一些东西,为什么不呢?有谁知道如何使用注释配置Spring Boot调度的池大小?我不在应用程序中使用xml,也不愿意仅将其引入调度程序。

安纳托利·迪恩卡(Anatoly Deyneka)

我在您的示例中看到了绝对正常的行为。您已经安排了任务,该任务每分钟由线程池中的其他线程执行一次。线程池中的线程处于线程池预期的WAITING(停放)状态。如果要减少线程数,可以配置该线程:http : //docs.spring.io/spring/docs/4.0.x/spring-framework-reference/htmlsingle/#scheduling

<task:scheduler id="scheduler" pool-size="2"/>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Spring Boot @计划的cron

来自分类Dev

Spring Cloud Dataflow和计划任务

来自分类Dev

如何找出计划任务挂起的原因?

来自分类Dev

Spring计划任务-仅运行一次

来自分类Dev

如何使用日历对象在Spring Scheduler中计划任务?

来自分类Dev

Spring 计划任务:在 XML 配置中指定时区

来自分类Dev

配置Spring计划任务在用户认证后启动

来自分类Dev

在 Spring/Maven 创建的 .war 文件上配置计划任务

来自分类Dev

Spring,Java - 并行运行许多计划任务

来自分类Dev

Spring 计划任务在多个线程池中重叠

来自分类Dev

在Spring Boot中等效于Dropwizard任务

来自分类Dev

Spring Boot App运行计划的作业两次

来自分类Dev

带有启动计划的Spring Boot请求映射

来自分类Dev

Spring Boot Batch中的Hibernate_sequence错误(计划的)

来自分类常见问题

Spring MVC与Spring Boot与Spring

来自分类Dev

Quartz Job和带有Spring的计划任务之间的区别?

来自分类Dev

Java Spring在特定时区的特定时间执行计划任务

来自分类Dev

使用注释将Spring任务计划程序应用于同一Bean的多个实例

来自分类Dev

FTP-使用Spring Integration任务计划程序进程在一定时间后停止

来自分类常见问题

Spring MVC或Spring Boot

来自分类Dev

Spring Batch JpaPagingItemReader挂起

来自分类Dev

Spring Batch JpaPagingItemReader挂起

来自分类Dev

带有Gradle的Spring Boot无法完成任务:test?

来自分类Dev

jar和构建jar的任务之间的Spring Boot问题:Gradle

来自分类Dev

在 Spring Boot 中编译项目时执行 Gradle 任务

来自分类Dev

如果一段时间不使用 spring-boot 服务会挂起

来自分类Dev

使用计划在 Azure WebJob 上运行 Spring Boot 应用程序

来自分类Dev

Spring Batch挂起,无输出

来自分类Dev

Spring @计划的默认值

Related 相关文章

热门标签

归档