使用JobExplorer访问时失败异常返回Empty

时间:2013-11-26 16:08:19

标签: spring spring-batch spring-batch-admin

我有一个Web应用程序,我上传文件后立即上传文件,我使用job launcher和async task executor启动作业。因此,该工作在其自己的线程中运行。 spring批处理作业吐出csv,导入数据库并对数据进行一些验证。因此,在任何一个步骤中出现任何类型的异常,例如由于无效日期错误解析平面文件,我使用的所有异常

jobExecution.getAllFailureExceptions()

使用listner在作业结束时通过错误电子邮件发送出去。上传文件的用户我让线程睡了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列中的数据库作业存储库中看到了步骤异常和作业级异常,但是当我使用job explorer检索作业执行时,它们未加载。有没有解决方法?我必须创建自定义查询来检索步骤执行异常和作业异常?请帮我。

下面是我的工作存储库,jobexplorer和taskexecutor config

<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>

1 个答案:

答案 0 :(得分:1)

JobExplorer仅返回JobRepository中的内容。由于失败异常列表未存储在JobRepository中,因此您将无法获得该列表。如果您确实需要维护错误列表,则必须将它们存储在独立于JobRepository的某个位置或使用ExecutionContext。如果您正在使用ExecutionContext,请注意您放入的内容与该列在数据库中的大小。