在非Spring环境下Main方法中,怎么使用spring的ThreadPoolTaskScheduler启动Scheduler?

2023-12-13 18:58:04

作为Java开发人员,在使用spring框架的时候,如果想要获取到线程池对象,可以直接使用spring框架提供的ThreadPoolxxx来获取。那么在非spring环境下,main函数怎么使用ThreadPoolTaskScheduler呢?下面凯哥(凯哥Java:kaigejava)就来讲讲在main函数中怎么使用.

如果我们直接使用下面代码:

ThreadPoolTaskScheduler();
????????taskScheduler.setPoolSize(10);
????????taskScheduler.setRemoveOnCancelPolicy(true);
????????taskScheduler.setThreadNamePrefix("task-");
????????ScheduledFuture<?>?scheduledFuture?=?taskScheduler.schedule(jobDTO,?cronTrigger);

在执行后,会报错。错误信息:java.lang.IllegalStateException: 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);
????}
}

其实就是在调用任务器调度任务前执行taskScheduler.initializer()就可以了。

扩展:在Spring环境下使用ThreadPoolTaskScheduler

第一步:创建线程池配置

package?com.kaigejava.config;

import?org.apache.commons.pool2.BasePooledObjectFactory;
import?org.apache.commons.pool2.PooledObject;
import?org.apache.commons.pool2.impl.DefaultPooledObject;
import?org.apache.commons.pool2.impl.GenericObjectPool;
import?org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import?org.springframework.context.annotation.Bean;
import?org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import?org.springframework.stereotype.Component;

import?javax.script.ScriptContext;
import?javax.script.SimpleScriptContext;
import?java.time.Duration;

/**
?*?线程池的配置类
?*?@version?1.0
?*/
@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;
????}

?
}

第二步:使用

@Resource(name?=?"collectTaskPool")
private?ThreadPoolTaskScheduler?taskScheduler;

public?void?taskDoing(){
?//?初始化你的任务和触发器(这里假设?jobDTO?和?cronTrigger?已经定义)
????????Runnable?jobDTO?=?/*?Your?Runnable?implementation?*/;
????????CronTrigger?cronTrigger?=?/*?Your?CronTrigger?implementation?*/;
?????????//?使用任务调度器调度任务
????????taskScheduler.schedule(jobDTO,?cronTrigger);
}

通过上面两步,就可以在Spring环境下使用带有定时任务的线程池了。

文章来源:https://blog.csdn.net/kaizi_1992/article/details/134852924
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。