我正在重构一个传统的基于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。
您可以使用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;
}
}
与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。