当前位置: 首页 > 知识库问答 >
问题:

spring boot计划任务挂起

赫连晋
2023-03-14

我使用spring boot with@Scheduled已经有一段时间了,但是最近我发现有一个潜在的危险威胁,如下所述:我发现当应用程序运行和计划任务运行几次时,有很多线程等待但没有完成,这在thread stacktrace中显示为'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----

线程堆栈跟踪:

“Pool-3-Thread-2”#26 prio=5 OS_prio=0 tid=0x00007FBEA0CD9800 NID=0x74F2等待条件[0x00007FBF0D3D2000]java.lang.Thread.State:等待(停车)在sun.misc.unsafe.park(本机方法)-停车等待<0x0000000763ed3710>(a java.util.concurrent.Locks.AbstractQueuedSynchronizer$ConditionObject)在java.util.concurrent.Locks.AbstractQueuedSynchronizerD.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>(a java.util.concurrent.Locks.AbstractQueuedSynchronizer$ConditionObject)在java.util.concurrent.Locks.AbstractQueuedSynchronizerD.java:745)

预定的javadoc显示

通过注册ScheduleDanNotationBeanPostProcessor来执行@ScheduleDanNotationBeanPostProcessor的处理。

我自己还没有给这个类命名,只是用@EnableScheduling注释的main class命名。

有人知道怎么解决这个问题吗?

我附上了一张Eclipse调试截屏的图片,池正在增加,所有的旧线程都在运行……希望能澄清我的问题。

更新:我想我这次是正确的。Spring Boot调度程序的默认池大小为100,所有线程都处于运行状态。我真的不明白,跑什么?我想应该是在等什么,为什么不呢?有没有人知道如何使用注释配置Spring Boot计划池大小?我没有在我的应用程序中使用xml,也不愿意只为调度程序引入它。

共有1个答案

陶法
2023-03-14

我在你的例子中看到了绝对正常的行为。您有计划的任务,它每分钟由线程池中的不同线程执行。线程池中的线程处于线程池所期望的等待(停车)状态。如果要减少线程数,可以配置如下:http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/htmlsingle/#scheduling

<task:scheduler id="scheduler" pool-size="2"/>
 类似资料:
  • 我用SpringBoot创建了一个简单的演示应用程序,其中包括执行器。带有@Scheduled注释的任务显示在执行器中,但以编程方式启动的任务不会显示。有没有办法让他们也出现? 我已经注释了@Enable调度。 我的组件如下所示: 执行器的结果仅显示带注释的任务:

  • 计划任务系统使用说明 新版计划任务为用户提供了以下功能 创建一个计划任务 修改一个计划任务 删除计划任务 查看一个namespace的所有计划任务 查看一个namespcae的某个计划任务详细内容 查看一个计划任务的执行状况 查看任务的日志 查看创建的计划任务列表和某个计划任务的详细信息。 点击计划任务v2,进入计划任务列表,在这里可以看到用户名下的所有计划任务,点击一个计划任务,可以看到该计划任

  • 亚马逊宣布了AWS Lambda(http://AWS.Amazon.com/Lambda/)。 产品说明包括: 计划任务 AWS Lambda函数可以由外部事件计时器触发,因此可以在定期计划的维护时间或非高峰时段运行函数。例如,您可以触发一个AWS Lambda函数,在非繁忙时间执行每晚的存档清理。 当我读到这篇文章时,我明白了我终于可以有一种方法来始终如一地完成“类似朋党”的任务。我想每天下午

  • 我有一个简单的计划任务,它是使用@计划注释创建的。类似这样的东西- 我还有一个蓝绿色升级场景,在这个场景中,这个计划任务可能会在蓝色和绿色集群中运行。鉴于这个计划任务修改了数据库,其中一个节点可能会覆盖来自另一个节点的数据——或者最坏情况下的竞争条件。 我想暂停绿色集群上所有计划的任务,直到它准备好接受流量。我已经有了代码来监听应用程序状态的变化。 我探索了几个选择- 只需在任务开始时添加一个布尔

  • > 我需要在执行前一个任务后以不同的延迟一个接一个地运行计划的任务。示例。有一个任务列表和延迟列表。 现在我需要运行task1通过100ms,task2在task1之后通过9ms,task3在task2之后通过22ms等等。 我正在使用javafx。任务可以使用一些UI更新方法,例如更改节点位置。这迫使我使用平台。runLater()方法,因为如果不这样做,则会出现异常“Not on FX app

  • 我已经创建了一个控制台应用程序,并尝试在任务计划程序中运行。当我通过单击可执行文件或使用快捷方式运行它时,它工作正常,但当我在任务调度程序中运行它时,我得到“PHLIP231 Prod的应用程序访问路径' C:\WINDOWS\DMBErrors '被拒绝。” 我已经在我的应用程序中搜索了此路径,甚至尝试手动将路径添加到我的计算机,但没有成功。我的应用程序构建了一个excel文件并将其写入相对于可