Spring Batch Commandline Arugments Jobparameter
Command Line argument with main
Previous post, I explained how to use command line arguments Spring Batch Commandline Arugments.
In this case, we use CommandLineRunner and XML. This is legacy style.
We want to use our own main method and JavaConfig.
And pass command line arguments to JobParameter.
Preparation
To use main method and JavaConfig for this goal, we need to do following
- application.yml
- JavaConfig
- main
application.yml(src/main/
spring:
batch:
job:
enabled: false
- application.yml
- JavaConfig
- main
application.yml(src/main/
spring: batch: job: enabled: false
To do this, we can prevent batch auto run from config and main.
JavaConfig
This includes job definition
@Configuration @EnableBatchProcessing @EnableAutoConfiguration public class BatchConfig { @Autowired private JobBuilderFactory jobBuilderFactory; @Autowired private StepBuilderFactory stepBuilderFactory; @Bean public Step step1() { return stepBuilderFactory.get("step1") //.listener(steplitener()) .tasklet(new Tasklet(){ public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) { // Get Job parameter JobParameters parameters = chunkContext.getStepContext().getStepExecution().getJobExecution().getJobParameters(); System.out.println("Step1:" + parameters.getString("date")); return RepeatStatus.FINISHED; } }).build(); } @Bean public Job job(Step step1) throws Exception { return jobBuilderFactory.get("job") .incrementer(new RunIdIncrementer()) .start(step1) .build(); } }
Main.java
@SpringBootApplication public class Main { public static void main(String... args) throws Exception { if (args.length != 0 && args.length % 2 == 1) { // First parameter is jobname String jobName = args[0]; Map<String, String> params = new HashMap<String, String>(); for (int i=1; i < args.length; i+=2) { String key = args[i]; String value = args[i+1]; params.put(key.replace("-", ""), value); } // TODO need to consider double run prevention params.put("timestamp", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // Start ConfigurableApplicationContext context = SpringApplication.run(Main.class, args); JobLauncher jobLauncher = context.getBean("jobLauncher", JobLauncher.class); Properties property = new Properties(); for (Map.Entry<String, String> set : params.entrySet()) { property.put(set.getKey(), set.getValue()); } JobParameters jobParameters = new DefaultJobParametersConverter().getJobParameters(property); Job job = (Job)context.getBean(jobName, Job.class); JobExecution jobExecution = jobLauncher.run(job, jobParameters); } else { // Error throw new Exception("Need at least one argument jobName and parameter should be --key value"); } } }
Set up configuration using SpringApplication.run, but do nothing because disable batch run.
After getting context we prepare our own job runner and run job
Run
Please build jar file and run with java command
Example
java -jar build/libs/BatchPractice-0.0.1-SNAPSHOT.jar job --type daily --date 20161201
job is jobname, –key value are arguments