Quartz 导致 Proxool couldn't shutdown pool

                                                 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();
		}
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值