JFinal中的TimerTask的find函数总报空指针异常

风声没 发布于 2015/01/16 17:40
阅读 2K+
收藏 1
        我的项目中需要循环每分钟对一些数据进行验证,所以用TimerTask实现。
Timer _timer = new Timer();
_timer.schedule(new CDialStatusChangeTask(), 3000, 60000);



上面是一个Timer,目前整个项目有两个这杨的Timer调用不同的TimerTask.我是指主配置类里面启动的这个,但是经常启动后find()报空指针异常,或者报c3p0连接关闭,但是过会又能继续访问。

java.lang.NullPointerException
	at com.jfinal.plugin.activerecord.Model.find(Model.java:457)
	at com.jfinal.plugin.activerecord.Model.find(Model.java:474)
	at com.teledial.model.CDialListDetail.getResultCDialListDetail(CDialListDetail.java:45)
	at com.teledial.dbtask.ResultBackDBTask.run(ResultBackDBTask.java:33)
	at java.util.TimerThread.mainLoop(Timer.java:555)
	at java.util.TimerThread.run(Timer.java:505)
具体报错语句:

return dao.find(" select * from c_diallistdetail where  result='1' and beget=1 and diallistid in (select t1.id from c_diallist t1,c_dialplan t2 where t1.planid=t2.id and t2.status=3 )");




加载中
0
JFinal
JFinal
检查Timer 启动的是否在 ActiveRecordPlugin start() 之前,贴出一下 time 启动的相关代码是在哪里?
0
风声没

引用来自“JFinal”的评论

检查Timer 启动的是否在 ActiveRecordPlugin start() 之前,贴出一下 time 启动的相关代码是在哪里?
public void configPlugin(Plugins me) {

        DBTask _dbTask = new DBTask();
        _dbTask.CDialStatus();
        _dbTask.CDialResultBack();    
    }



public class DBTask {
	public void CDialStatus(){
		Timer _timer = new Timer();
		_timer.schedule(new CDialStatusChangeTask(), 3000, 60000);
	}
	public void CDialResultBack(){
		Timer _timer = new Timer();
		_timer.schedule(new ResultBackDBTask(), 1000,60000);
	}
}



昨天的时候我设置Timer启动的时候是同时启动的,后来我设置不同时后发现就不报错了。这是不是因为多个线程同时调用c3p0导致有一个线程调用不到,所以会出现find函数里面的Connection空指针,还有时候显示获取不到c3p0.
0
JFinal
JFinal

引用来自“JFinal”的评论

检查Timer 启动的是否在 ActiveRecordPlugin start() 之前,贴出一下 time 启动的相关代码是在哪里?

引用来自“风声没”的评论

public void configPlugin(Plugins me) {

        DBTask _dbTask = new DBTask();
        _dbTask.CDialStatus();
        _dbTask.CDialResultBack();    
    }



public class DBTask {
	public void CDialStatus(){
		Timer _timer = new Timer();
		_timer.schedule(new CDialStatusChangeTask(), 3000, 60000);
	}
	public void CDialResultBack(){
		Timer _timer = new Timer();
		_timer.schedule(new ResultBackDBTask(), 1000,60000);
	}
}



昨天的时候我设置Timer启动的时候是同时启动的,后来我设置不同时后发现就不报错了。这是不是因为多个线程同时调用c3p0导致有一个线程调用不到,所以会出现find函数里面的Connection空指针,还有时候显示获取不到c3p0.
c3p0 是数据库连接池,肯定是允许多线程同时从 c3p0 获取连接的,可能在 ActiveRecordPlugin start() 之前就调用了 find(), 导致了 NullPointerException,此时 ARP 还未初始化
0
风声没

引用来自“JFinal”的评论

检查Timer 启动的是否在 ActiveRecordPlugin start() 之前,贴出一下 time 启动的相关代码是在哪里?

引用来自“风声没”的评论

public void configPlugin(Plugins me) {

        DBTask _dbTask = new DBTask();
        _dbTask.CDialStatus();
        _dbTask.CDialResultBack();    
    }



public class DBTask {
	public void CDialStatus(){
		Timer _timer = new Timer();
		_timer.schedule(new CDialStatusChangeTask(), 3000, 60000);
	}
	public void CDialResultBack(){
		Timer _timer = new Timer();
		_timer.schedule(new ResultBackDBTask(), 1000,60000);
	}
}



昨天的时候我设置Timer启动的时候是同时启动的,后来我设置不同时后发现就不报错了。这是不是因为多个线程同时调用c3p0导致有一个线程调用不到,所以会出现find函数里面的Connection空指针,还有时候显示获取不到c3p0.

引用来自“JFinal”的评论

c3p0 是数据库连接池,肯定是允许多线程同时从 c3p0 获取连接的,可能在 ActiveRecordPlugin start() 之前就调用了 find(), 导致了 NullPointerException,此时 ARP 还未初始化
在Timer有时候会报c3p0的错,我把Timer启动时间調晚后没有空指针异常了。
com.jfinal.plugin.activerecord.ActiveRecordException: java.sql.SQLException: com.mchange.v2.c3p0.ComboPooledDataSource [ java.beans.IntrospectionException: java.lang.reflect.InvocationTargetException [numThreadsAwaitingCheckoutDefaultUser] ] has been closed() -- you can no longer use it.
	at com.jfinal.plugin.activerecord.Model.find(Model.java:455)
	at com.jfinal.plugin.activerecord.Model.find(Model.java:474)
	at com.teledial.model.CDialListDetail.getResultCDialListDetail(CDialListDetail.java:45)
	at com.teledial.dbtask.ResultBackDBTask.run(ResultBackDBTask.java:33)
	at java.util.TimerThread.mainLoop(Unknown Source)
	at java.util.TimerThread.run(Unknown Source)
Caused by: java.sql.SQLException: com.mchange.v2.c3p0.ComboPooledDataSource [ java.beans.IntrospectionException: java.lang.reflect.InvocationTargetException [numThreadsAwaitingCheckoutDefaultUser] ] has been closed() -- you can no longer use it.
	at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.assertCpds(AbstractPoolBackedDataSource.java:447)
	at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getPoolManager(AbstractPoolBackedDataSource.java:459)
	at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
	at com.jfinal.plugin.activerecord.Config.getConnection(Config.java:185)
	at com.jfinal.plugin.activerecord.Model.find(Model.java:452)
	... 5 more



ResultBackDBTask.java:33是
            List<CDialListDetail> _listDetail = CDialListDetail.getResultCDialListDetail();
at com.teledial.model.CDialListDetail.getResultCDialListDetail(CDialListDetail.java:45) 是

public static List<CDialListDetail> getResultCDialListDetail(){
        return dao.find(" select * from c_diallistdetail where  result='weichaxun' and beget=1 and diallistid in (select t1.id from c_diallist t1,c_dialplan t2 where t1.planid=t2.id and t2.status=3 )");
    }
不知道为什么有时候会报这个错。
0
JFinal
JFinal

引用来自“JFinal”的评论

检查Timer 启动的是否在 ActiveRecordPlugin start() 之前,贴出一下 time 启动的相关代码是在哪里?

引用来自“风声没”的评论

public void configPlugin(Plugins me) {

        DBTask _dbTask = new DBTask();
        _dbTask.CDialStatus();
        _dbTask.CDialResultBack();    
    }



public class DBTask {
	public void CDialStatus(){
		Timer _timer = new Timer();
		_timer.schedule(new CDialStatusChangeTask(), 3000, 60000);
	}
	public void CDialResultBack(){
		Timer _timer = new Timer();
		_timer.schedule(new ResultBackDBTask(), 1000,60000);
	}
}



昨天的时候我设置Timer启动的时候是同时启动的,后来我设置不同时后发现就不报错了。这是不是因为多个线程同时调用c3p0导致有一个线程调用不到,所以会出现find函数里面的Connection空指针,还有时候显示获取不到c3p0.

引用来自“JFinal”的评论

c3p0 是数据库连接池,肯定是允许多线程同时从 c3p0 获取连接的,可能在 ActiveRecordPlugin start() 之前就调用了 find(), 导致了 NullPointerException,此时 ARP 还未初始化

引用来自“风声没”的评论

在Timer有时候会报c3p0的错,我把Timer启动时间調晚后没有空指针异常了。
com.jfinal.plugin.activerecord.ActiveRecordException: java.sql.SQLException: com.mchange.v2.c3p0.ComboPooledDataSource [ java.beans.IntrospectionException: java.lang.reflect.InvocationTargetException [numThreadsAwaitingCheckoutDefaultUser] ] has been closed() -- you can no longer use it.
	at com.jfinal.plugin.activerecord.Model.find(Model.java:455)
	at com.jfinal.plugin.activerecord.Model.find(Model.java:474)
	at com.teledial.model.CDialListDetail.getResultCDialListDetail(CDialListDetail.java:45)
	at com.teledial.dbtask.ResultBackDBTask.run(ResultBackDBTask.java:33)
	at java.util.TimerThread.mainLoop(Unknown Source)
	at java.util.TimerThread.run(Unknown Source)
Caused by: java.sql.SQLException: com.mchange.v2.c3p0.ComboPooledDataSource [ java.beans.IntrospectionException: java.lang.reflect.InvocationTargetException [numThreadsAwaitingCheckoutDefaultUser] ] has been closed() -- you can no longer use it.
	at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.assertCpds(AbstractPoolBackedDataSource.java:447)
	at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getPoolManager(AbstractPoolBackedDataSource.java:459)
	at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
	at com.jfinal.plugin.activerecord.Config.getConnection(Config.java:185)
	at com.jfinal.plugin.activerecord.Model.find(Model.java:452)
	... 5 more



ResultBackDBTask.java:33是
            List<CDialListDetail> _listDetail = CDialListDetail.getResultCDialListDetail();
at com.teledial.model.CDialListDetail.getResultCDialListDetail(CDialListDetail.java:45) 是

public static List<CDialListDetail> getResultCDialListDetail(){
        return dao.find(" select * from c_diallistdetail where  result='weichaxun' and beget=1 and diallistid in (select t1.id from c_diallist t1,c_dialplan t2 where t1.planid=t2.id and t2.status=3 )");
    }
不知道为什么有时候会报这个错。
简单说就是在任务线程中使用 Active Record 插件时该插件还未初始化完成
JFinal
JFinal
回复 @风声没 : 在 YourJFinalConfig 中创建一个 public void afterJFinalStart() 方法,在此方法中启动任务线程
风声没
那怎么解决呢?主要是在Timer中偶尔会出现后就一直报这个错,并不是开始的时候报
0
带着爱心和梦想生活着
带着爱心和梦想生活着
问题,解决了吗? 楼主,我也是在定时任务中,每40秒,扫描一下数据库,出现了  has been closed() -- you can no longer use it 这个错误,你解决了吗?
风声没
好像如果你测试的时候出异常了,才会报。我现在是测试的时候出异常就重新启动一下。发到tomcat好像没这个问题
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部