Java 计划外作业时出错
当我关闭JBOSS服务器Java 计划外作业时出错,java,spring,oracle,jboss,quartz-scheduler,Java,Spring,Oracle,Jboss,Quartz Scheduler,当我关闭JBOSS服务器(ctrl+C)时,会导致以下异常 12:39:50,020 ERROR [com.kony.sync.console.job.scheduler.ConsoleJobScheduler] (ServerService Thread Pool -- 20) Error occurred while unscheduling jobs for application ID:PaaSJobs: org.qu artz.JobPersistenceException: Fail
(ctrl+C)
时,会导致以下异常
12:39:50,020 ERROR [com.kony.sync.console.job.scheduler.ConsoleJobScheduler] (ServerService Thread Pool -- 20) Error occurred while unscheduling jobs for application ID:PaaSJobs: org.qu
artz.JobPersistenceException: Failed to obtain DB connection from data source 'syncQuartzDS': java.sql.SQLException: Could not retrieve datasource via JNDI url 'java:jboss/datasources/C
onsoleDB' java.sql.SQLException: javax.resource.ResourceException: IJ000451: The connection manager is shutdown: java:jboss/datasources/ConsoleDB [See nested exception: java.sql.SQLExce
ption: Could not retrieve datasource via JNDI url 'java:jboss/datasources/ConsoleDB' java.sql.SQLException: javax.resource.ResourceException: IJ000451: The connection manager is shutdow
n: java:jboss/datasources/ConsoleDB]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.getConnection(JobStoreSupport.java:715) [quartz-all-1.8.6.jar:]
at org.quartz.impl.jdbcjobstore.JobStoreTX.getNonManagedTXConnection(JobStoreTX.java:69) [quartz-all-1.8.6.jar:]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3785) [quartz-all-1.8.6.jar:]
at org.quartz.impl.jdbcjobstore.JobStoreTX.executeInLock(JobStoreTX.java:90) [quartz-all-1.8.6.jar:]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.removeTrigger(JobStoreSupport.java:1458) [quartz-all-1.8.6.jar:]
at org.quartz.core.QuartzScheduler.unscheduleJob(QuartzScheduler.java:965) [quartz-all-1.8.6.jar:]
at org.quartz.impl.StdScheduler.unscheduleJob(StdScheduler.java:290) [quartz-all-1.8.6.jar:]
at com.kony.sync.console.job.scheduler.ConsoleJobScheduler.unscheduleJob(ConsoleJobScheduler.java:225) [syncconsole.jar:]
at com.kony.sync.services.context.SyncContextListener.contextDestroyed(SyncContextListener.java:221) [classes:]
at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:3427) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
at org.apache.catalina.core.StandardContext.stop(StandardContext.java:3920) [jbossweb-7.2.2.Final-redhat-1.jar:7.2.2.Final-redhat-1]
at org.jboss.as.web.deployment.WebDeploymentService.doStop(WebDeploymentService.java:171) [jboss-as-web-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14]
at org.jboss.as.web.deployment.WebDeploymentService.access$100(WebDeploymentService.java:60) [jboss-as-web-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14]
at org.jboss.as.web.deployment.WebDeploymentService$2.run(WebDeploymentService.java:113) [jboss-as-web-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14]
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [rt.jar:1.6.0_26]
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) [rt.jar:1.6.0_26]
at java.util.concurrent.FutureTask.run(Unknown Source) [rt.jar:1.6.0_26]
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) [rt.jar:1.6.0_26]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [rt.jar:1.6.0_26]
at java.lang.Thread.run(Unknown Source) [rt.jar:1.6.0_26]
at org.jboss.threads.JBossThread.run(JBossThread.java:122)
Caused by: java.sql.SQLException: Could not retrieve datasource via JNDI url 'java:jboss/datasources/ConsoleDB' java.sql.SQLException: javax.resource.ResourceException: IJ000451: The co
nnection manager is shutdown: java:jboss/datasources/ConsoleDB
at org.quartz.utils.JNDIConnectionProvider.getConnection(JNDIConnectionProvider.java:163) [quartz-all-1.8.6.jar:]
at org.quartz.utils.DBConnectionManager.getConnection(DBConnectionManager.java:109) [quartz-all-1.8.6.jar:]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.getConnection(JobStoreSupport.java:712) [quartz-all-1.8.6.jar:]
... 20 more
Terminate batch job (Y/N)?
在上下文中(…)
我也有同样的问题,现在我已经找到了中描述的原因。为了避免这种情况,这里提出的解决方案是将jndi声明为web应用程序中的一种资源,这样它就不会在应用程序终止之前解除与jboss服务器的绑定 要实现这一点,请将以下部分添加到web.xml中,该部分设置对jboss jndi的引用,名称为“jdbc/myDS”
jdbc/myDS
javax.sql.DataSource
容器
java:jboss/datasources/ConsoleDB
然后,不要从代码部分中查找“java:jboss/datasources/ConsoleDB”,它指向实际的jndi,我假设您使用
数据源ds=(数据源)
查找(“java:jboss/datasources/ConsoleDB”)
,您现在应该查找“java:comp/env/jdbc/myDS”,它将引用您放在web.xml中的资源,该资源实际上指向实际的jndi(我们以前在web.xml中添加的部分中将其指定为“lookup name”xml属性):
数据源ds=(数据源)
查找(“java:comp/env/jdbc/myDS”)
我通过仅将数据源添加到persistence.xml(不需要web.xml)并在数据源上使用@Resource(lookup=“datasourceName”)注释解决了这个问题。 您可以使用@Resource注释节省大量样板代码,因为您不必担心打开和关闭连接等问题。
只需调用“datasource.getConnection()”就足以检索现有连接。您让容器执行作业:-D在作业计划外之前,我应该做什么来避免异常?我已经尝试了与suugested类似的方法,尝试了以下方法没有帮助
ExecutorService eService=Executors.newFixedThreadPool(2);eService.shutdown();如果(!eService.awaitTermination(60000,TimeUnit.SECONDS)){System.err.println(“线程未在60000秒内完成!”);}
对于作业调度程序没有帮助。是否有任何方法解决JBOSS问题
jobScheduler.unscheduleJob(PaaSConsoleUtil.PAAS_CLEANUP_JOB_NAME, PaaSConsoleUtil.JOB_GROUP);
jobScheduler.shutdown(true);
//scheduler.shutdown();
executor.shutdown();
//clear the connection pool.
ConnectionPool.clear();
//Closing HttpClientIdleConnectionTimeoutThread through connector utils.
ConnectorUtils.shutdown();
//Shutdown the monitoring async executor task.
SyncEventListenerUtil.shutdownThreadPool();
//Destroy all console related threads here and deregister all drivers.
ConsoleContextUtil consoleUtil = new ConsoleContextUtil(logger, false);
consoleUtil.consoleContextDestroyed();
<resource-ref>
<res-ref-name>jdbc/myDS</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<lookup-name>java:jboss/datasources/ConsoleDB</lookup-name>
</resource-ref>