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

将作业配置导入通用作业配置类(注释配置)

池俊茂
2023-03-14

我正在重构一个传统的基于Spring Batch XML的应用程序,以使用注释配置。我想了解如何将以下XML文件转换为基于注释的配置,并保持相同的关注分离。

为了便于讨论,这里有一个简单的例子。

job-config-1.xml

<job id="job1" xmlns="http://www.springframework.org/schema/batch">
               <batch:step id="step1">
                    <batch:tasklet throttle-limit="20" task-executor="taskExecutor">
                        <batch:chunk reader="reader1"
                            writer="writer1" commit-interval="500" />
                    </batch:tasklet>
                </batch:step>
</job>

job-config-2.xml

<job id="job2" xmlns="http://www.springframework.org/schema/batch">
                   <batch:step id="step2">
                        <batch:tasklet throttle-limit="20" task-executor="taskExecutor">
                            <batch:chunk reader="reader2"
                                writer="writer2" commit-interval="500" />
                        </batch:tasklet>
                    </batch:step>
</job>

job-config-3。xml

<import
        resource="classpath*:/spring/jobs/job-config-1.xml" />
<import
        resource="classpath*:/spring/jobs/job-config-2.xml" />
<batch:job id="jobFlow">

            
    <batch:step id="step1" next="step2">
        <job ref="job1" job-launcher="jobLauncher" />
    </batch:step>

    <batch:step id="step2">
        <job ref="job2" job-launcher="jobLauncher" />
    </batch:step>
    
</batch:job>

我想从XML配置转移到Java配置。我想为每个XML创建3个作业配置类。比如说JobConfig1。java,JobConfig2。java和JobConfig3。JAVA

JobConfig3.java将导入JobConfig1.java和JobConfig2.java;然而,我在文档中找不到这种结构的示例。我该怎么做呢?

注意:我不打算使用Spring Boot。只需通过注释配置常规Spring Batch。

共有2个答案

金和雅
2023-03-14

您可以使用JobStep来定义步骤,例如在Job3中,step1应该如下所示:

@Autowired
ApplicationContext context;

public Step step1() {
    return stepBuilderFactory.get("step1").job(context.getBean("job1", Job.class))
            .parametersExtractor(new DefaultJobParametersExtractor()).build();
}

从这里,您可以像运行任何其他步骤一样运行step1,但当job3将调用此步骤时,将执行job1的所有步骤job1是您的校长的子作业job3

对于job1,他的定义应该是这样的:(与JobConfig2相同)

@Configuration
class JobConfig1 {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job job1() {
        return jobBuilderFactory.get("job1").incrementer(new RunIdIncrementer()).start(step1()).build();
    }

    // definition of steps
    public Step step1() {
        return null;
    }
}
上官斌
2023-03-14

与XML配置等效的方法是在每个作业自己的配置类中定义每个作业,然后在主作业的配置中导入这些类。下面是一个简单的例子:

import org.springframework.batch.core.Job;
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;
import org.springframework.context.annotation.Import;

@Configuration
// @Import({Job1Config.class, Job2Config.class}) // use this if the classes where you define sub jobs are not nested
@EnableBatchProcessing
public class MainJobConfig {

    @Bean
    public Job mainJob(JobBuilderFactory jobs, StepBuilderFactory steps, Job job1, Job job2, JobLauncher jobLauncher) {
        return jobs.get("mainJob")
                .start(steps.get("subJob1").job(job1).launcher(jobLauncher).build())
                .next(steps.get("subJob2").job(job2).launcher(jobLauncher).build())
                .build();
    }
    
    @Configuration
    static class Job1Config {
        // define job 1 artefacts (reader, writer, steps, etc)
        // for simplicity, the step is inlined in the job definition
        @Bean
        public Job job1(JobBuilderFactory jobs, StepBuilderFactory steps) {
            return jobs.get("job1")
                    .start(steps.get("job1Step1").tasklet((contribution, chunkContext) -> {
                        System.out.println("job1");
                        return RepeatStatus.FINISHED;
                    }).build())
                    .build();
        }
    }

    @Configuration
    static class Job2Config {
        // define job 2 artefacts (reader, writer, steps, etc)
        // for simplicity, the step is inlined in the job definition
        @Bean
        public Job job2(JobBuilderFactory jobs, StepBuilderFactory steps) {
            return jobs.get("job2")
                    .start(steps.get("job2Step1").tasklet((contribution, chunkContext) -> {
                        System.out.println("job2");
                        return RepeatStatus.FINISHED;
                    }).build())
                    .build();
        }
    }

    public static void main(String[] args) throws Exception {
        ApplicationContext context = new AnnotationConfigApplicationContext(MainJobConfig.class);
        JobLauncher jobLauncher = context.getBean(JobLauncher.class);
        Job job = context.getBean("mainJob", Job.class);
        jobLauncher.run(job, new JobParameters());
    }

}
 类似资料:
  • 问题内容: 为什么Jenkins有两种工作,即多配置项目和自由样式项目?我读过某个地方,一旦选择其中一个,就无法(轻松地)转换为另一个。为什么我不总是选择多配置项目以确保将来的更改安全? 我想为在Windows和Unix(以及其他平台)上构建的项目设置构建。我发现了这个问题),它提出了相同的问题,但我并没有真正找到答案。为什么我需要三个矩阵项目(而不是三个自由样式项目),每个平台一个?为什么不能将

  • 我计划使用Azkaban https://Azkaban.github.io/来运行批处理作业。根据CI的思想,我们有很少的环境,比如开发、测试、阶段、生产,当然作业应该为每个环境配置不同的配置。 根据Azkaban文档http://Azkaban.github.io/Azkaban/docs/latest/#job-configuration,Azkaban允许在找到${parameter}时替

  • 当编写器抛出异常时,我希望能够将步骤和作业状态设置为失败。在做了一些调试和检查Spring批处理源代码后,我注意到配置了一个,它认为是一个致命的异常,因此将作业状态设置为FAILED,所以我将代码包装在我的编写器中的一个try-get中,将包装在中,现在作业和步骤状态设置为FAILED,这是我想要的。我不确定这是否是正确的方法,因为我在任何地方都找不到它的文档,的留档也没有提到它。所以,问题是:这

  • 我想在linux jenkins中配置IOS项目作业。在没有OSX PC的情况下,是否可以在Linux Jenkins中配置IOS作业。

  • 如果有其他的方法来配置jHipster中的石英作业,请告诉我。或者,如果jHipster为调度程序工作提供了开箱即用的功能,那就太好了。 石英作业依赖关系

  • 我有一个Spring配置类,我正在使用它从属性文件中读取并创建bean。 在xml文件中 我能够设置和属性,但无法将属性设置为,因为我们需要注入及其。请让我知道如何在方法中注入bean。