ama*_*der 10 spring spring-batch spring-boot spring-java-config
我在同一个项目中有两个独立的弹簧批处理作业,因为我想使用相同的基础结构相关的bean.一切都是用Java配置的.我想知道是否有一种正确的方法来启动独立的作业,例如在main方法中的第一个java app参数上.如果我SpringApplication.run
只运行第二个作业就会被魔术执行.主要方法如下:
@ComponentScan
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
app.setWebEnvironment(false);
ApplicationContext ctx= app.run(args);
}
}
Run Code Online (Sandbox Code Playgroud)
并且这两个作业的配置如Spring.io上的Spring Batch入门教程中所示.这是第一个作业的配置文件,第二个作业以相同的方式配置.
@Configuration
@EnableBatchProcessing
@Import({StandaloneInfrastructureConfiguration.class, ServicesConfiguration.class})
public class AddPodcastJobConfiguration {
@Autowired
private JobBuilderFactory jobs;
@Autowired
private StepBuilderFactory stepBuilderFactory;
//reader, writer, processor...
}
Run Code Online (Sandbox Code Playgroud)
为了启用模块化,我创建了一个AppConfig类,在这里我为两个作业定义了工厂:
@Configuration
@EnableBatchProcessing(modular=true)
public class AppConfig {
@Bean
public ApplicationContextFactory addNewPodcastJobs(){
return new GenericApplicationContextFactory(AddPodcastJobConfiguration.class);
}
@Bean
public ApplicationContextFactory newEpisodesNotificationJobs(){
return new GenericApplicationContextFactory(NotifySubscribersJobConfiguration.class);
}
}
Run Code Online (Sandbox Code Playgroud)
PS我是Java配置Spring Boot和Spring Batch中的Spring配置新手...
Han*_*ier 17
只需设置"spring.batch.job.names = myJob"属性即可.您可以在启动应用程序时将其设置为SystemProperty(-Dspring.batch.job.names = myjob).如果已定义此属性,则spring-batch-starter将仅启动由此属性定义的作业.
ama*_*der 11
要从main方法运行您喜欢的作业,您可以从应用程序上下文加载所需的作业配置bean和JobLauncher,然后运行它:
@ComponentScan
@EnableAutoConfiguration
public class ApplicationWithJobLauncher {
public static void main(String[] args) throws BeansException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException, InterruptedException {
Log log = LogFactory.getLog(ApplicationWithJobLauncher.class);
SpringApplication app = new SpringApplication(ApplicationWithJobLauncher.class);
app.setWebEnvironment(false);
ConfigurableApplicationContext ctx= app.run(args);
JobLauncher jobLauncher = ctx.getBean(JobLauncher.class);
JobParameters jobParameters = new JobParametersBuilder()
.addDate("date", new Date())
.toJobParameters();
if("1".equals(args[0])){
//addNewPodcastJob
Job addNewPodcastJob = ctx.getBean("addNewPodcastJob", Job.class);
JobExecution jobExecution = jobLauncher.run(addNewPodcastJob, jobParameters);
} else {
jobLauncher.run(ctx.getBean("newEpisodesNotificationJob", Job.class), jobParameters);
}
System.exit(0);
}
}
Run Code Online (Sandbox Code Playgroud)
造成我很多困惑的原因是第二份工作被执行了,即使第一份工作似乎被跑步者"捡到"......问题是在两个工作的配置文件中我都使用了标准的方法名称writer(), reader(), processor() and step()
和它使用了第二个作业中那些似乎从第一个作业"覆盖"而没有任何警告的作业......我使用了一个应用程序配置类@EnableBatchProcessing(modular=true)
,我认为它会被Spring Boot神奇地使用:
@Configuration
@EnableBatchProcessing(modular=true)
public class AppConfig {
@Bean
public ApplicationContextFactory addNewPodcastJobs(){
return new GenericApplicationContextFactory(AddPodcastJobConfiguration.class);
}
@Bean
public ApplicationContextFactory newEpisodesNotificationJobs(){
return new GenericApplicationContextFactory(NotifySubscribersJobConfiguration.class);
}
}
Run Code Online (Sandbox Code Playgroud)
我会在准备好的时候写一篇关于它的博客文章,但在此之前,代码可以在https://github.com/podcastpedia/podcastpedia-batch(工作/学习进行中)获得.
归档时间: |
|
查看次数: |
18508 次 |
最近记录: |