linux安装定时任务插件,JFinal - scheduler 插件做定时任务

我在项目中遇到一个需求:服务运行期间,数据库要定期去监测某表并且更新。

正好项目是使用 jfinal 做的,于是就用了 jfinal-scheduler 插件来解决(jfinal-scheduler 可以用来做定时任务):

配置插件,在自定义的 JFinalConfig 类中引入此插件:

/*** 配置插件*/

public voidconfigPlugin(Plugins me) {//...//定时器插件

SchedulerPlugin sp = newSchedulerPlugin();

Runnable task= newTask();

sp.fixedRateSchedule(task,60);

me.add(sp);//...

}

完善线程

public class Task implementsRunnable{

@Overridepublic voidrun() {//DML操作

}

}

完成上述工作之后,我启动服务器,发现在 DML 操作之处必现线程阻塞。然而我将这段 DML 操作放到 Controller 中是能够正常执行并查出数据的。

后来发现原因在这里:

public class SchedulerPlugin implementsIPlugin {//...

private finalScheduledThreadPoolExecutor taskScheduler;publicSchedulerPlugin() {this(getBestPoolSize(), null);

}public ScheduledFuture> fixedRateSchedule(Runnable task, intperiodSeconds) {return taskScheduler.scheduleAtFixedRate(task, 0, periodSeconds, TimeUnit.SECONDS);

}//...

}

在插件调用 fixedRateSchedule(...) 的时候,会调 ScheduledThreadPoolExecutor.scheduleAtFixedRate(...),第二个参数的意思是第一次启动线程会在多少秒后执行,因为源码中这个参数是 0,也就是马上执行的意思,然而此时数据库还没有连上呢,查询操作自然就出异常了。我把 0 改成了 60,果然,1分钟后,线程启动,运行正常。

用到的源码和jar包 myaniu-jfinal-scheduler-master.zip 与 cron4j-2.2.5.zip 下载:

到Linux公社资源站下载:

------------------------------------------分割线------------------------------------------

具体下载目录在 /2016年资料/9月/17日/JFinal - scheduler 插件做定时任务/

------------------------------------------分割线------------------------------------------

JFinal的详细介绍:请点这里

JFinal的下载地址:请点这里

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JFinal 框架本身没有提供定时任务功能,但是可以通过集成第三方库来实现定时任务。下面介绍两种实现方式: 1. 使用Quartz定时任务 Quartz 是一个开源的 Java 定时任务框架,可以实现复杂的定时任务调度。在 JFinal 框架中使用 Quartz 可以通过以下步骤实现: 1. 引入 Quartz 依赖 在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> ``` 2. 编写定时任务类 ```java public class MyJob implements Job { public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Hello World!"); } } ``` 3. 配置定时任务JFinal 的配置文件中添加以下代码: ```java public class DemoConfig extends JFinalConfig { public void configConstant(Constants me) { // ... } public void configRoute(Routes me) { // ... } public void configPlugin(Plugins me) { // ... } public void configInterceptor(Interceptors me) { // ... } public void configHandler(Handlers me) { // ... } public void afterJFinalStart() { try { // 创建 Scheduler SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); // 创建 JobDetail JobDetail job = JobBuilder.newJob(MyJob.class) .withIdentity("myJob", "group1") .build(); // 创建 Trigger Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .startNow() .withSchedule(simpleSchedule() .withIntervalInSeconds(10) .repeatForever()) .build(); // 将 JobDetail 和 Trigger 添加到 Scheduler 中 sched.scheduleJob(job, trigger); // 启动 Scheduler sched.start(); } catch (SchedulerException e) { e.printStackTrace(); } } } ``` 以上代码会在 JFinal 启动后创建一个定时任务,每隔 10 秒钟打印一次 "Hello World!"。 2. 使用ScheduledExecutorService定时任务 ScheduledExecutorService 是 Java 提供的一个定时任务调度器,可以很方便地实现简单的定时任务。在 JFinal 框架中使用 ScheduledExecutorService 可以通过以下步骤实现: 1. 编写定时任务类 ```java public class MyTask implements Runnable { public void run() { System.out.println("Hello World!"); } } ``` 2. 配置定时任务JFinal 的配置文件中添加以下代码: ```java public class DemoConfig extends JFinalConfig { public void configConstant(Constants me) { // ... } public void configRoute(Routes me) { // ... } public void configPlugin(Plugins me) { // ... } public void configInterceptor(Interceptors me) { // ... } public void configHandler(Handlers me) { // ... } public void afterJFinalStart() { ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); scheduler.scheduleAtFixedRate(new MyTask(), 0, 10, TimeUnit.SECONDS); } } ``` 以上代码会在 JFinal 启动后创建一个定时任务,每隔 10 秒钟打印一次 "Hello World!"。 注意事项: 1. 定时任务需要在 JFinal 启动后创建,因此需要在 afterJFinalStart() 方法中配置定时任务。 2. 如果使用 Quartz 定时任务,需要在 JFinal 启动前初始化 Quartz,否则会出现 "Scheduler is not started" 的错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值