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

文件可用后立即运行Spring批处理作业

锺离慈
2023-03-14

当共享文件夹中的文件可用时,我希望立即运行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-关闭完成。

另外,我如何确保每次都读取一个新文件,而不是再次读取旧文件

共有1个答案

司空丰
2023-03-14

我不能支持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中。或