Java 计划外作业时出错

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

当我关闭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: 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>