基于 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 {@Override public 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);
- }
- // ...
- }
在定时器插件调用这个方法的时候,会调 ScheduledThreadPoolExecutor 的 scheduleAtFixedRate 方法,第二个参数的意思是第一次启动线程会在多少秒后执行,因为源码中这个参数是 0,也就是马上执行的意思,然而此时数据库还没有连上呢,查询操作自然就出异常了。
用到的源码和 jar 包:
来源: http://www.cnblogs.com/xmsx/p/5846655.html