首页 / 操作系统 / Linux / JFinal - scheduler 插件做定时任务
我在项目中遇到一个需求:服务运行期间,数据库要定期去监测某表并且更新。正好项目是使用 jfinal 做的,于是就用了 jfinal-scheduler 插件来解决(jfinal-scheduler 可以用来做定时任务):配置插件,在自定义的 JFinalConfig 类中引入此插件:/** * 配置插件 */public void configPlugin(Plugins me) {// ...// 定时器插件SchedulerPlugin sp = new SchedulerPlugin();Runnable task = new Task();sp.fixedRateSchedule(task, 60);me.add(sp);// ...}完善线程public class Task implements Runnable{@Overridepublic void run() {// DML操作}}完成上述工作之后,我启动服务器,发现在 DML 操作之处必现线程阻塞。然而我将这段 DML 操作放到 Controller 中是能够正常执行并查出数据的。后来发现原因在这里:public class SchedulerPlugin implements IPlugin {// ... private final ScheduledThreadPoolExecutor taskScheduler;public SchedulerPlugin() {this(getBestPoolSize(), null);}public ScheduledFuture<?> fixedRateSchedule(Runnable task, int periodSeconds) {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公社资源站下载:------------------------------------------分割线------------------------------------------免费下载地址在 http://linux.linuxidc.com/用户名与密码都是www.linuxidc.com具体下载目录在 /2016年资料/9月/17日/JFinal - scheduler 插件做定时任务/下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm------------------------------------------分割线------------------------------------------Jfinal学习之路---Controller使用 http://www.linuxidc.com/Linux/2014-07/104323.htmJFinal开发8个常见问题 http://www.linuxidc.com/Linux/2015-02/113421.htmJFinal的详细介绍:请点这里
JFinal的下载地址:请点这里本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-09/135249.htm