ThreadPoolTaskScheduler 在 Main 函数和 Spring 环境下的使用

举报
凯哥Java 发表于 2023/12/10 12:36:00 2023/12/10
【摘要】         Scheduler技术分享:在Main函数中优雅地使用 ThreadPoolTaskScheduler大家好,我是凯哥Java,今天我们将探讨如何在非Spring环境下,通过Main函数正确地使用ThreadPoolTaskScheduler。同时,我也会分享在Spring环境下如何配置和使用ThreadPoolTaskScheduler。在Java开发中,我们经常使用Spr...

        Scheduler


技术分享:在Main函数中优雅地使用 ThreadPoolTaskScheduler


大家好,我是凯哥Java,今天我们将探讨如何在非Spring环境下,通过Main函数正确地使用ThreadPoolTaskScheduler。同时,我也会分享在Spring环境下如何配置和使用ThreadPoolTaskScheduler。

在Java开发中,我们经常使用Spring框架来简化应用程序的开发。Spring提供了许多便捷的工具,其中包括 ThreadPoolTaskScheduler 用于处理定时任务。然而,当我们希望在非Spring环境下的 main 函数中使用 ThreadPoolTaskScheduler 时,可能会遇到 java.lang.IllegalStateException: ThreadPoolTaskScheduler not initialized 错误。


01
在Main函数中使用ThreadPoolTaskScheduler

在非Spring环境下,直接使用ThreadPoolTaskScheduler时可能会遇到java.lang.IllegalStateException: ThreadPoolTaskScheduler not initialized的错误。为了解决这个问题,我们需要在调度任务之前手动初始化ThreadPoolTaskScheduler。

通过在调度任务之前调用taskScheduler.initialize(),我们可以顺利地避免ThreadPoolTaskScheduler not initialized的异常。

import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
public class MainApplication {
    public static void main(String[] args) {
        // 初始化 ThreadPoolTaskScheduler
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(10);
        taskScheduler.setRemoveOnCancelPolicy(true);
        taskScheduler.setThreadNamePrefix("task-");
        // 初始化你的任务和触发器(这里假设 jobDTO 和 cronTrigger 已经定义)
        Runnable jobDTO = /* Your Runnable implementation */;
        CronTrigger cronTrigger = /* Your CronTrigger implementation */;
        // 设置任务调度器
        taskScheduler.initialize();
        // 使用任务调度器调度任务
        taskScheduler.schedule(jobDTO, cronTrigger);
    }
}


02
在Spring环境下使用ThreadPoolTaskScheduler

在Spring环境下,我们可以通过配置类来轻松使用ThreadPoolTaskScheduler。以下是两个简单的步骤:

第一步:创建线程池配置

import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.stereotype.Component;
@Component
public class CollectTaskConfig {
    @Bean(name = "collectTaskPool")
    public ThreadPoolTaskScheduler threadPoolTaskScheduler(){
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(30);
        threadPoolTaskScheduler.setRemoveOnCancelPolicy(true);
        threadPoolTaskScheduler.setThreadNamePrefix("task-");
        return threadPoolTaskScheduler;
    }
}


第二步:在需要使用的地方注入线程池并调度任务

import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.beans.factory.annotation.Autowired;
public class YourClass {
    @Autowired
    private ThreadPoolTaskScheduler taskScheduler;
    public void taskDoing(){
        // 初始化你的任务和触发器(这里假设 jobDTO 和 cronTrigger 已经定义)
        Runnable jobDTO = /* Your Runnable implementation */;
        CronTrigger cronTrigger = /* Your CronTrigger implementation */;
        
        // 使用任务调度器调度任务
        taskScheduler.schedule(jobDTO, cronTrigger);
    }
}

通过以上两步,我们就能够在Spring环境下优雅地配置和使用带有定时任务的线程池。希望这份技术分享对大家有所帮助!

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。