当共享文件夹中的文件可用时,我希望立即运行Spring批处理作业。我已经制作了一个观察器服务来检查目录中的新条目,但是我如何触发我的批处理作业呢?
我做了以下更改-
@Component
public class ScheduleJob {
private Logger log = LoggerFactory.getLogger(this.getClass());
@Autowired
private JobLauncher jobLauncher;
@Autowired
private UtilizationBatchConfiguration utilizationBatchConfiguration;
@Value("${excel.to.database.job.source.file.source.path}")
private String PROPERTY_EXCEL_SOURCE_FILE_PATH;
//@Scheduled(cron = "${excel.to.database.job.cron}")
public void runJob() {
//String fileSource = PROPERTY_EXCEL_SOURCE_FILE_PATH.concat(PROPERTY_EXCEL_SOURCE_FILE_NAME)+".xlsx";
Path path = Paths.get(PROPERTY_EXCEL_SOURCE_FILE_PATH);
WatchKey key;
WatchService watchService = null;
try {
watchService = FileSystems.getDefault().newWatchService();
path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
while ((key = watchService.take()) != null) {
for (WatchEvent<?> event : key.pollEvents()) {
System.out.println(
"Event kind:" + event.kind()
+ ". File affected: " + event.context() + ".");
if(event.kind().equals("ENTRY_CREATE")) {
impoerJob();
}
}
key.reset();
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
private void impoerJob() {
// make unique JobParameters so now instance of job can be started
Map<String, JobParameter> confMap = new HashMap<String, JobParameter>();
confMap.put("time", new JobParameter(System.currentTimeMillis()));
JobParameters jobParameters = new JobParameters(confMap);
try {
JobExecution ex = jobLauncher.run(utilizationBatchConfiguration.importExcelJob(), jobParameters);
log.info(String.format("Execution status-----> %s, Execution Start Time ------> %s, Execution End Time %s", ex.getStatus(), ex.getStartTime(), ex.getEndTime()));
} catch (JobExecutionAlreadyRunningException | JobRestartException | JobInstanceAlreadyCompleteException
| JobParametersInvalidException e) {
//
e.printStackTrace();
}
}
}
@Component
public class UtilizationBatchConfiguration {
---- removed for brevity
@Bean
public Job importExcelJob() {
return jobBuilderFactory.get("importExcelJob")
.incrementer(new RunIdIncrementer())
.preventRestart()
.listener(listener)
.flow(step1())
.end()
.build();
}
}
现在,如果我尝试运行代码,我会得到下面的响应-
10.506秒内启动应用程序(JVM运行为11.676)2018-07-23 16:55:53.646信息18200---[Thread-2]S.C.A.AnnotationConfigApplicationContext:关闭org.springframework.context.annotationConfigApplicationContext@7b9a4292:启动日期[Mon Jul 23 16:55:44 IST 2018];上下文层次结构的根目录2018-07-23 16:55:53.649信息18200---[线程-2]O.S.J.E.A.注释MBeanExporter:在关机时注销JMX公开的beans 2018-07-23 16:55:53.650信息18200---[
线程-2]O.S.J.E.A.注释MBeanExporter:注销JMX公开的beans 2018-07-23 16:55:53.654信息18200---[
线程-2]J.LocalContainerEntityManagerFactoryBean:为持久性单元“Default”关闭JPA 655信息18200---[线程-2]com.zaxxer.hikari.hikaridataSource:HikariPool-1-关机启动...2018-07-23 16:55:53.683信息18200---[线程-2]com.zaxxer.hikari.hikaridataSource:HikariPool-1-关闭完成。
另外,我如何确保每次都读取一个新文件,而不是再次读取旧文件?
我不能支持WatchService
,但通常JVM需要至少一个非守护进程线程来防止它关闭。看起来您的应用程序没有这个功能(所以它正在关闭)。在这个用例中使用Spring Integration是很常见的,我们在下面的文档中有这一点:https://docs.Spring.io/spring-batch/trunk/reference/html/springbatchintegration.html#tunning-batch-jobs-through-messages
我们的Spring Batch应用程序在重新启动失败的作业时,再次处理相同的记录,导致重复的行,我们希望了解如何避免这种情况。 启动批处理作业的Spring集成轮询器配置为每两个小时运行一次。第二次运行时,作业参数将相同,但如果上一次运行失败(例如,由于数据截断异常),Spring Batch不会抱怨作业已完成。 在故障点,几十万条记录已经被处理并从源表复制到目标表。在以后运行作业时,相同的行将复
我正在使用spring批处理读取CSV文件并使用controller触发器将其写入DB。在启动应用程序时,在我从浏览器url中点击之前,我会在启动时看到来自阅读器的打印语句。虽然它不为我的处理器或写入器打印它,它们是在单独的类中,我已经自动连线。是因为读者是豆子吗?
我正在做一个项目,我们正在使用Spring Boot、Spring Batch和Camel。 关于如何在JobExecution数据可用时立即返回它,有什么想法吗?
我不知道如何使用调用Spring批处理中定义的作业,文档细节对我来说是不够的。 我遵循了Spring Batch官方指南,使用Java注释(例如)在Spring Batch中编写作业,因为我希望避免使用XML配置文件来描述作业、步骤等。 到目前为止我已经: 配置类(见下文),我使用AnnotaIon将定义、、、和(带有的所有内容放入其中。 具有方法的类,该方法具有并具有注释,以导入处理作业中的数据
我有一个作业流,我希望以以下方式运行它: 作业流将从Job1开始。在Job1成功完成后,Job1将同时启动Job2和Job4。 Job2和Job4将并行运行。 在Job2成功完成后,Job2将启动Job3。 在Job4成功完成后,Job4将启动Job5。 下面是job1.xml和job1的作业启动器类的代码片段: job1.xml uijobLauncher.java “job2,Job3”对和“
问题内容: 运行main方法时,将执行作业。这样我无法弄清楚如何控制作业的执行。例如,您如何安排作业,访问作业执行或设置作业参数的方式。 我试图注册自己的JobLauncher 但是当我尝试在主要方法中使用它时: 当加载上下文时,该作业再次执行,而当我尝试手动运行它时,我得到了。有没有办法防止自动作业执行? 问题答案: 通过设置可以防止作业执行 在application.properties中。或