我有一个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);
}
如何捕获异常?
我看到您在作业启动程序中只传递了一个参数作为“文件名”。一旦作业启动器启动,它将从存储库的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个记录,作业标记为成功完成。