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

Spring批处理和JobInstancealReadyCompleteException:

尚河
2023-03-14

我有一个Spring批处理作业,它通过SFTP从远程Linux服务器检索文件。远程服务器上的目录是一个包含七天文件(约400个文件)的存档。文件的大小相对较小。

Spring批处理知道哪些文件已经被处理。

当我启动应用程序时。第一次,Spring Batch tasklet检索文件时,Spring Batch会为它已经处理的每个文件生成一个异常:

>

  • 在Transformer类中,是否应该检查文件是否存在于本地,并且仅对尚未处理的新文件调用JobLaunchRequest()s?

    /**

    >

  • 将BAI文件转换为Spring批处理作业启动请求*/public class FileMessageToJobRequestTransformer{public static final Logger Logger=LoggerFactory.getLogger(FileMessageToJobRequestTransformer.class);私有作业作业;

    public void setFileParameterName(String fileParameterName){Logger.Debug(“File parameter Name:{}”,fileParameterName);This.fileParameterName=fileParameterName;}

    @Transformer public JobLaunchRequest transform(Message Message){logger.debug(“File Message:{}”,Message);JobParametersBuilder JobParametersBuilder=new JobParametersBuilder();

    jobParametersBuilder.addString(fileParameterName,
            "file://" + message.getPayload().getAbsolutePath());
    
    LOGGER.debug("Job params: {}", jobParametersBuilder.toJobParameters());
    
    return new JobLaunchRequest(job, jobParametersBuilder.toJobParameters());
    

    }}

    JobInstanceAlReadyCompleteException

    <!--获取新的BAI文件时,转换为spring批处理作业请求-->

    附加addDate()允许多次处理文件。现在数据库中有DUP。

    jobParametersBuilder.addString(fileParameterName,
                    "file://" + message.getPayload().getAbsolutePath())).addDate("rundate", new Date()).toJobParameters();
    

    例如。

    public interface JobExplorer {
    
        List<JobInstance> getJobInstances(String jobName, int start, int count);
    
        JobExecution getJobExecution(Long executionId);
    
        StepExecution getStepExecution(Long jobExecutionId, Long stepExecutionId);
    
        JobInstance getJobInstance(Long instanceId);
    
        List<JobExecution> getJobExecutions(JobInstance jobInstance);
    
        Set<JobExecuthtml" target="_blank">ion> findRunningJobExecutions(String jobName);
    }
    

    如何捕获异常?


  • 共有1个答案

    霍永年
    2023-03-14

    我看到您在作业启动程序中只传递了一个参数作为“文件名”。一旦作业启动器启动,它将从存储库的BATCH_JOB_EXECUTION表中查询,并检查上次处理的作业的状态。在当前的作业执行中,输入参数与以前执行的作业相同,并且批处理状态&退出代码=completed,那么您将得到JobInstancealReadyCompleteException。你应该尝试在每一次执行中都传递唯一的Parmaeters。只需传递一个当前时间作为参数并尝试它

    JobParameters jobparam =   new JobParametersBuilder().addString(fileParameterName, "file://" + message.getPayload().getAbsolutePath())
                            .addDate("rundate", new Date()).toJobParameters();
    
    JobExecution execution = jobLauncher.run(job, jobparam);
             catch (Exception e) {
                 if ( e instanceof JobInstanceAlreadyCompleteException){
                     System.out.println("Raj*************");
                 }
    

    >

  • 2是的,您可以这样处理

    catch(Exception e){if(e instanceof JobInstanceAlreadyCompleteException){system.out.println(“need to handle*************”);}

  •  类似资料:
    • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。

    • 我有一个spring批处理应用程序(spring boot 2.3.5版),它在spring批处理时使用一个JpaRepository将一些自定义日志消息插入数据库。这与开箱即用的spring批处理表是分开的。似乎当我从ItemProcessorAdapter抛出异常时,它会被ItemProcessListener onProcessError()方法捕获。在这个方法中,我执行一个JpaRepos

    • 我想分散加工大批量。这个想法是使用Spring Batch在云中激发一堆AMQP消费者,然后加载廉价的任务(如项目ID)并将它们提交给AMQP交换。结果的书写将由消费者自己完成。 null

    • 当我使用Spring批处理管理运行长时间运行的批处理作业的多个实例时,它会在达到jobLauncher线程池任务执行程序池大小后阻止其他作业运行。但是从cron中提取多个工作似乎效果不错。下面是作业启动器配置。 Spring批处理管理员Restful API是否使用不同于xml配置中指定的作业启动器?

    • 我对Spring批处理跳过逻辑有一些问题。我已经配置了一个作业的步骤来跳过两个异常(SQLIntegrityConstraintViolation异常和乐观锁定失败异常): 但当作业运行时,由于我将其配置为跳过的异常,作业以未知状态完成: 我做错什么了吗?我希望这一步跳过负责抛出其中一个异常的项,并继续处理,以便以完成状态结束。

    • 我在表中总共有8条记录,其中6条在spring批处理调用read时可以使用jpareader。现在我将页面大小和块大小设置为1以进行测试。期望作业运行时,它应该进行6次读取调用,然后它应该逐个处理,逐个写入。但实际上发生的是,它只是调用read 4次(从日志中我可以看到这样读取页面0...1)并处理4个,其中一个由于不匹配写入标准而被过滤掉,然后它只是更新了3个记录,作业标记为成功完成。