Proxool couldn't shutdown pool
问题:关闭容器时抛了一个Proxool线程池不能关闭的错误。
1.错误日志:
[1/16/18 11:45:58:779 CST] 00000073 SystemOut O [ABMP1.0 Log -->] 2018/01/16 11:45:58 ERROR org.logicalcobwebs.proxool.DBPool:578 - WebContainer : 7 couldn't shutdown pool
java.lang.InterruptedException
at org.logicalcobwebs.concurrent.WriterPreferenceReadWriteLock$WriterLock.acquire(WriterPreferenceReadWriteLock.java:248)
at org.logicalcobwebs.proxool.ConnectionPool.acquirePrimaryWriteLock(ConnectionPool.java:1003)
at org.logicalcobwebs.proxool.ConnectionPool.shutdown(ConnectionPool.java:470)
at org.logicalcobwebs.proxool.ProxoolFacade.removeConnectionPool(ProxoolFacade.java:176)
2.问题分析:
查看代码后,最终确定导致出错的原因是由于Quartz启的Job任务中连接着数据库,而容器关闭时,并没有将Quartz启的任务关闭,所以Quartz一直占用着数据库连接,导致Proxool连接池关闭错误!
3.解决问题:
在web.xml中设置一个Listener监听,当容器关闭时调用监听将Quartz任务关闭!
web.xml
<listener>
<listener-class>
com.kiosk.abmp.SpringContextInitListener
</listener-class>
</listener>
SpringContextInitListener
public void contextDestroyed(ServletContextEvent servletcontextevent) {
runSocketService.destroy();
SimpleQuarzJobLauncher.stopJob();
System.out.println("destroy");
}
SimpleQuarzJobLauncher
private static Logger log = LogManager.getLogger(WebKeys.ABMP_JOBCOMM_LOG);
private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();
public SimpleQuarzJobLauncher() {
// TODO Auto-generated constructor stub
}
public static boolean launchJob(String jobDetailName, String jobName,
JobDataMap _jobDataMap) {
try {
ApplicationContext context = SpringCtxHelper.getCtx();
JobDetail jobDetail = (JobDetail) context.getBean(jobDetailName);
Date date = new Date();
jobDetail.setName("jobDetail_" + jobName + date.getTime());
JobDataMap jobDataMap = jobDetail.getJobDataMap();
if (!context.containsBean(jobName)) {
log.error("启动任务失败: " + jobName + "没有配置!");
return false;
}
jobDataMap.put("jobName", jobName);
jobDataMap.put("key", date.getTime());
jobDataMap.putAll(_jobDataMap);
SimpleTrigger simpleTrigger = new SimpleTrigger("simpleTrigger_"
+ jobName + date.getTime(), "quartz-batch");
simpleTrigger.setStartTime(new Date());
simpleTrigger.setRepeatInterval(1000000000);
simpleTrigger.setRepeatCount(0);
//SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail, simpleTrigger);
log.info("开始启动任务:" + jobName);
scheduler.start();
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
return true;
}
public static void stopJob(){
try {
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.shutdown(true);
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}