当前位置: 首页 > 知识库问答 >
问题:

当tomcat关闭时,在Spring Batch中获取NullPointerException

符渊
2023-03-14

我用的是带有石英的Spring批。我有一个bean destroy方法,在tomcat关闭时重置数据库中的一些标志。由于以下异常,未调用销毁方法:

2013-06-18 18:11:16,505  INFO | schedulerFactoryBean_Worker-3 | org.quartz.core.JobRunShell  | Job DEFAULT.fundAdditionRequestJobDetail threw a JobExecutionException:  
org.quartz.JobExecutionException: Error while executing Spring Batch job 
at com.inmobi.sap.quartz.AbstractQuartzLauncher.executeInternal(AbstractQuartzLauncher.java:88) ~[AbstractQuartzLauncher.class:na]
    at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:113) ~[spring-context-support-3.2.3.RELEASE.jar:3.2.3.RELEASE]
    at org.quartz.core.JobRunShell.run(JobRunShell.java:213) ~[quartz-2.1.7.jar:na]
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557) [quartz-2.1.7.jar:na]
Caused by: java.lang.NullPointerException: null
    at org.apache.commons.logging.impl.SLF4JLocationAwareLog.isTraceEnabled(SLF4JLocationAwareLog.java:60) ~[jcl-over-slf4j-1.6.1.jar:1.1.1]
    at org.springframework.transaction.support.TransactionSynchronizationManager.getResource(TransactionSynchronizationManager.java:139) ~[spring-tx-3.2.3.RELEASE.jar:3.2.3.RELEASE]
    at org.springframework.jdbc.datasource.DataSourceTransactionManager.doGetTransaction(DataSourceTransactionManager.java:180) ~[spring-jdbc-3.2.3.RELEASE.jar:3.2.3.RELEASE]
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:336) ~[spring-tx-3.2.3.RELEASE.jar:3.2.3.RELEASE]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:417) ~[spring-tx-3.2.3.RELEASE.jar:3.2.3.RELEASE]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:255) ~[spring-tx-3.2.3.RELEASE.jar:3.2.3.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94) ~[spring-tx-3.2.3.RELEASE.jar:3.2.3.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) ~[spring-aop-3.2.3.RELEASE.jar:3.2.3.RELEASE]
    at com.sun.proxy.$Proxy11.update(Unknown Source) ~[na:na]
    at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:340) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
    at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:120) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
    at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:49) ~[spring-core-3.2.3.RELEASE.jar:3.2.3.RELEASE]
    at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:114) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
    at com.inmobi.sap.quartz.AbstractQuartzLauncher.executeInternal(AbstractQuartzLauncher.java:84) ~[AbstractQuartzLauncher.class:na]
    ... 3 common frames omitted 

2013-06-18 18:11:16,508 ERROR | schedulerFactoryBean_Worker-3 | org.quartz.core.ErrorLogger   | An error occured while marking executed job complete. job= 'DEFAULT.fundAdditionRequestJobDetail' 
org.quartz.JobPersistenceException: Failed to obtain DB connection from data source 'springNonTxDataSource.schedulerFactoryBean': java.lang.NullPointerException
    at org.quartz.impl.jdbcjobstore.JobStoreCMT.getNonManagedTXConnection(JobStoreCMT.java:173) ~[quartz-2.1.7.jar:na]
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3788) ~[quartz-2.1.7.jar:na]
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3760) ~[quartz-2.1.7.jar:na]
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.triggeredJobComplete(JobStoreSupport.java:3000) ~[quartz-2.1.7.jar:na]
    at org.quartz.core.QuartzScheduler.notifyJobStoreJobComplete(QuartzScheduler.java:1753) ~[quartz-2.1.7.jar:na]
    at org.quartz.core.JobRunShell.run(JobRunShell.java:281) ~[quartz-2.1.7.jar:na]
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557) [quartz-2.1.7.jar:na]
Caused by: java.lang.NullPointerException: null
    at org.quartz.impl.jdbcjobstore.JobStoreCMT.getNonManagedTXConnection(JobStoreCMT.java:165) ~[quartz-2.1.7.jar:na]
    ... 6 common frames omitted

配置数据源:

<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource"
    destroy-method="close">
    <property name="driverClass" value="${batch.jdbc.driver}" />
    <property name="jdbcUrl" value="${batch.jdbc.url}" />
    <property name="username" value="${batch.jdbc.user}" />
    <property name="password" value="${batch.jdbc.password}" />
    <property name="idleConnectionTestPeriod" value="60" />
    <property name="idleMaxAge" value="240" />
    <property name="maxConnectionsPerPartition" value="${batch.jdbc.pool.size}" />
    <property name="minConnectionsPerPartition" value="4" />
    <property name="partitionCount" value="1" />
    <property name="acquireIncrement" value="3" />
    <property name="statementsCacheSize" value="0" />
    <property name="releaseHelperThreads" value="3" />
</bean>

石英的配置:

<property name="quartzProperties">
            <props>
                    <prop key="org.quartz.scheduler.skipUpdateCheck">true</prop>
                    <!-- <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop> -->
                    <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
                    <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
                    </prop>
                    <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop>
                    <prop key="org.quartz.jobStore.isClustered">true</prop>
                    <prop key="org.quartz.scheduler.instanceName">MyClusteredScheduler</prop>
                    <prop key="org.quartz.scheduler.instanceId">AUTO</prop>
            </props>
</property>

据我所知,在关闭时,数据源被破坏,记录器变为null,导致NullPointerException。无法确定原因,请给我指出正确的方向。

共有1个答案

丌官利
2023-03-14

我还没试过用Spring石英。然而,通常在使用石英时,我们会优雅地关闭石英。我在这里的意思是,我的计划程序在完成后还没有正常执行,但我的所有作业都将被关闭。

对于优雅的关闭,我们在使用方法shutdown时传递属性true。请参考这里的API

我很想知道spring quartz实现是如何做到这一点的。

 类似资料:
  • 我有以下情况 我单击父窗口中的一个链接(即添加注释链接)打开一个新窗口。我添加了一个注释,然后单击关闭按钮切换回父窗口

  • 本文向大家介绍在Python中获取当前时间,包括了在Python中获取当前时间的使用技巧和注意事项,需要的朋友参考一下 若要将自纪元浮点值以来的秒数转换为时间元组,请将浮点值传递给一个函数(例如localtime),该函数返回一个具有全部九项有效的时间元组。 示例 输出结果 这将产生以下结果,可以将其格式化为任何其他可表示的形式-

  • 我使用的是Spring会话JDBC,并注意到当用户进行身份验证后数据库关闭时,下一个请求将导致嵌入的Tomcat白色错误页(500)。Spring Boot允许我们使用@ControllerAdvice或ErrorController自定义错误页面。我无法使用这些机制,因为我认为异常发生在请求处理周期的早期。我在控制器通知和ErrorController中都设置了断点,没有中断发生。 堆栈跟踪显示

  • 错误:传输错误202:绑定失败:地址已在使用错误:JDWP传输dt_socket初始化失败,TRANSPORT_INIT(510)JDWP退出错误AGENT_ERROR_TRANSPORT_INIT(197):未初始化传输[debuginit.c:750]本机方法中的致命错误:JDWP未初始化传输,jvmtierror=AGENT_ERROR_TRANSPORT_INIT(197) 知道吗?

  • 我的项目包括Apache 。 在 tomcat 关闭时引发异常,如果运行默认示例,则无异常。 卡特琳娜通话完毕。 信息:非法访问:此 Web 应用程序实例已停止。无法加载 org.apache.log4j.spi.ThrowableInformation.最终的以下堆栈跟踪是由出于调试目的而引发的错误以及尝试终止导致非法访问的线程引起的,并且不会对功能产生影响。 信息:非法访问:此 Web 应用程

  • 我无法找到在tomcat停止的情况下,当我的应用程序关闭时,没有被调用的原因。 我有一个web应用程序,通过web.xml中的ContextLoaderListener加载spring上下文,如下所示: web.xml 下面是我的应用程序中的员工bean: Employee.class bean在我的应用程序上下文文件中定义如下: appContext.xml Tomcat控制台日志: 当我启动我