我有一个 Web 应用程序,我在上传文件后立即上传文件,我使用作业启动器和异步任务执行器启动作业。所以从技术上讲,这项工作在它自己的线程中运行。spring 批处理作业输出 csv,导入数据库并对数据进行一些验证。因此,在任何步骤中出现任何类型的异常,例如由于日期无效而导致解析平面文件时出错,我使用的所有异常
jobExecution.getAllFailureExceptions()
在作业结束时使用侦听器以错误电子邮件形式发送。而上传文件的用户我让线程休眠了 4 分钟
while(isJobRunning(jobId)) {
if(count == 0)
break;
Thread.sleep(sleepMilliSeconds);
count--;
}
然后如果作业在我在 UI 中向用户显示步骤级别和作业级别的所有验证错误消息之前完成。所以现在我用
jobExecution = jobExplorer.getJobExecution(jobExecution.getId());
现在,当我这样做以获得jobExecution.getAllFailureExceptions()
它时,它会返回空异常。我在 'EXIT_MESSAGE' BATCH_JOB_EXECUTION 和 BATCH_JOB_STEP_EXECUTION 列中的数据库作业存储库中看到了步骤异常和作业级别异常,但是当我使用作业资源管理器检索作业执行时它们没有加载。有什么解决方法吗?我必须创建自定义查询来检索步骤执行异常和作业异常吗?请帮我。
下面是我的工作存储库、jobexplorer 和 taskexecutor 配置
<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
<property name="dataSource" ref="batchDataSource" />
<property name="transactionManager" ref="batchTransactionManager" />
<property name="databaseType" value="Oracle" />
<property name="isolationLevelForCreate" value="ISOLATION_DEFAULT" />
</bean>
<bean id="jobLauncher"
class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
<property name="taskExecutor" ref="taskExecutor" />
</bean>
<bean id="taskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="1" />
<property name="maxPoolSize" value="3" />
</bean>
<bean id="jobExplorer"
class="org.springframework.batch.core.explore.support.JobExplorerFactoryBean">
<property name="dataSource" ref="batchDataSource"/>
</bean>