【问题标题】:How can I run a batch project with two independent jobs?如何运行具有两个独立作业的批处理项目?
【发布时间】:2023-03-26 08:13:02
【问题描述】:

我开始在Spring Batch创建一个项目,我创建了两个彼此没有关系的不同类。

这是NotificationOne.java 类:

@Slf4j
public class NotificationOne {
   public NotificationDataOne {
      log.info("NotificationDataOne");
   }
}

这是NotificationTwo.java 类:

@Slf4j
public class NotificationOTwo {
   public NotificationDataTwo {
      log.info("NotificationDataTwo");
   }
}

这是我目前拥有但不知道如何完成的配置:

@Configuration
@EnableBatchProcessing
public class JobBatchConfiguration {
    
    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;
    
    @Bean
    public Job jobOne(NotificationOne notificationOne) {
      return jobBuilderFactory.get("jobOne").incrementer(new RunIdIncrementer())
          .listener(notificationOne).flow(null).end().build();
    }  

}

我需要的是能够启动这两个类并在配置类中进行配置。

【问题讨论】:

    标签: java spring spring-batch jobs


    【解决方案1】:

    唯一的事情是执行该类,但我不知道如何创建或修改配置案例。请您告诉我如何启动作业?

    这是一个快速的 hello world 作业以及如何从 main 方法启动它:

    import org.springframework.batch.core.Job;
    import org.springframework.batch.core.JobExecution;
    import org.springframework.batch.core.JobExecutionListener;
    import org.springframework.batch.core.JobParameters;
    import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
    import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
    import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
    import org.springframework.batch.core.launch.JobLauncher;
    import org.springframework.batch.repeat.RepeatStatus;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @EnableBatchProcessing
    public class MyJobConfiguration {
    
        @Bean
        public Job job(JobBuilderFactory jobs, StepBuilderFactory steps) {
            return jobs.get("job")
                    .start(steps.get("step")
                            .tasklet((contribution, chunkContext) -> {
                                System.out.println("hello world");
                                return RepeatStatus.FINISHED;
                            })
                            .build())
                    .listener(new NotificationOne())
                    .build();
        }
    
        public static void main(String[] args) throws Exception {
            ApplicationContext context = new AnnotationConfigApplicationContext(MyJobConfiguration.class);
            JobLauncher jobLauncher = context.getBean(JobLauncher.class);
            Job job = context.getBean(Job.class);
            jobLauncher.run(job, new JobParameters());
        }
    
        static class NotificationOne implements JobExecutionListener {
    
            @Override
            public void beforeJob(JobExecution jobExecution) {
                System.out.println("NotificationOne.beforeJob");
            }
    
            @Override
            public void afterJob(JobExecution jobExecution) {
                System.out.println("NotificationOne.afterJob");
            }
        }
    
    }
    

    打印出来:

    NotificationOne.beforeJob
    hello world
    NotificationOne.afterJob
    

    【讨论】:

    • 好的,是的,您正在显示来自配置文件的消息,但我希望能够启动我创建的 NotificationOne 类,而不是显示来自配置文件的消息。因为这个类以后会有更多的逻辑,我觉得把所有的东西都加到那个文件里是不好的
    • 我用您的NotificationOne 示例更新了答案,您正试图将其作为监听器传递给您的工作定义:jobBuilderFactory.get("jobOne").incrementer(new RunIdIncrementer()) .listener(notificationOne).flow(null).end().build()。正如我在最初的评论中所说,要将该类用作侦听器,您需要实现JobExecutionListener 或使用@BeforeJob/@AfterJob 注释方法。在我的回答中,我使用了第一种方法。
    • 好的,我明白了,但是控制台上出现的hello world是NotificationOne类的还是配置文件的tasklet的sysout?不知道我的问题是否理解?
    • “hello world”来自 tasklet。 “NotificationOne.beforeJob”和“NotificationOne.afterJob”来自监听器。您可以根据需要调整示例(删除 tasklet 并根据需要进行更改)。
    • 抱歉,我无法适应我想做的事情。我的问题如下,我有一个 NotificationOne.java 类,我想从 MyJobConfiguration.java 执行它,如果没有显示 NotificationOne 类的消息,则不显示该类中的消息。这是我做不到的,我不知道它是否适用于您设置的示例,但我无法启动它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    相关资源
    最近更新 更多