Как загрузить конфигурацию Spring на основе аргумента командной строки? - PullRequest
0 голосов
/ 10 января 2020

У меня есть несколько различных классов @Configuration, каждый из которых соответствует отдельному заданию Spring Batch, т. Е. В каждой конфигурации существует один компонент Job и каждый Step, Tasklet и т. Д. c. Требуется для данного задания существует в том же классе конфигурации, что и это задание. Пример:

@Configuration
public class DemoJobConfiguration(JobBuilderFactory jobBuilderFactory) {
    @Bean
    public Job demoJob() {
        return jobBuilderFactory.get("demoJob").start(...).build();
    }
}

@Configuration
public class TestJobConfiguration(JobBuilderFactory jobBuilderFactory) {
    @Bean
    public Job testJob() {
        return jobBuilderFactory.get("testJob").start(...).build();
    }
}

Приложение является приложением командной строки. Первый аргумент - это имя задания для запуска. Связанный компонент Job извлекается на основе этого аргумента и затем выполняется с помощью JobLauncher. Пример:

@Override
public void run(String... args) throws Exception {
    String jobName = args[0];
    Job job = prepareJob(jobName); //gets the Job from the application context
    JobParameters jobParameters = prepareJobParameters(args); //sets args[1], etc. to JobParameter objects
    JobExecution result = jobLauncher.run(job, jobParameters);
}

Я хотел бы знать, есть ли способ использовать аннотацию @Conditional (или что-то еще) для загрузки класса конфигурации, только если args [0] - это определенное значение, например,

@Configuration
@Conditional("\"testJob\".equals(args[0])")
public class TestJobConfiguration(JobBuilderFactory jobBuilderFactory) {
    ...
}

Преимущество этого заключается в том, что в память загружаются только компоненты, относящиеся к выполняемому заданию, а компоненты, соответствующие другим заданиям, никогда не загружаются. Это было бы в основном полезно, поскольку в проект добавляется больше заданий.

Возможна ли загрузка конфигураций на основе аргументов командной строки? Было ли это сделано раньше? Час поиска в Google ничего не дал, но я все еще надеюсь, что есть способ сделать это. 1014 *.

1 Ответ

0 голосов
/ 10 января 2020

Я нашел ответ на свой вопрос.

Решение:

  1. Включите аргумент командной строки в виде --jobName = testJob. Spring boot автоматически загрузит это в Environment (https://docs.spring.io/spring-boot/docs/1.0.1.RELEASE/reference/html/boot-features-external-config.html)

  2. Используйте аннотацию @ConditonalOnProperty, например, так:

    @ ConditionalOnProperty (значение = "jobName", withValue = "testJob") publi c класс TestJobConfiguration {...}

...