Nano Hash - криптовалюты, майнинг, программирование

Как читать из application.properties и устанавливать как параметр задания в Spring Batch

Я хочу прочитать из моего application.properties пути ввода и вывода для моего приложения Spring Batch и установить их в jobParametersBuilder, чтобы я мог получить к ним доступ во время выполнения задания (чтобы назначить их читателям и авторам).

Я мог читать из application.properties в других классах конфигурации, но, похоже, мне не удалось сделать это внутри моего основного класса. Мне нужно сделать это здесь, чтобы иметь возможность присвоить значение параметрам задания перед выполнением задания.

Мой основной класс:

@SpringBootApplication
public class GleBatchApplication {


 private static final Logger logger = 
 LogManager.getLogger(FormateadorJobConfig.class);

    @Value("${file.input}")
    private static String inputPath;

    @Value("${file.output}")
    private static String outputPath;


public static void main(String[] args) throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException {


     ApplicationContext ctx = SpringApplication.run(GleBatchApplication.class, args);

     JobLauncher lanzadorJob = ctx.getBean(JobLauncher.class);
     Job jobFormateador = ctx.getBean("jobFormateador", Job.class);
     JobParameters jobParameters = new JobParametersBuilder().
             addLong("Time in miliseconds: ", System.currentTimeMillis())
             .addString("inputPath", inputPath)
             .addString("outputPath", outputPath)
             .toJobParameters();

        System.out.println("Valor leido del properties: " + inputPath);
        System.out.println("Valor leido del properties: " + outputPath);


     JobExecution jobExecution = lanzadorJob.run(jobFormateador, jobParameters);
     logger.info("=================================================");
     logger.info("START TIME: " + jobExecution.getCreateTime());
     logger.info("FINISH TIME: " + jobExecution.getEndTime());
     logger.info("=================================================");

Мой файл application.properties:

spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url = 
jdbc:mysql://localhost:3306/curso_batch_multiplefilewriting_2? 
autoReconnect=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.platform=mysql
spring.datasource.continueOnError=false

spring.batch.job.enabled=false


file.input = /inputFiles/GLEO-MN170100-PROCESO01-SUBDFACT-000001.txt
file.output = outputFiles/GLEO-MN1701-PROCESO001-SUBDFACT-FORMATDO-000001.txt

Также я пробовал создать отдельный класс конфигурации для ввода и вывода, но я не понимаю, как вызвать его из моего основного класса:

InOutConfiguration:

@Configuration
@PropertySource("classpath:application.properties")
public class InOutConfiguration {

@Value("${file.input}")
 private  String inputPath;

@Value("${file.output}")
 private  String outputPath;


@Bean
  public static PropertySourcesPlaceholderConfigurer   propertySourcesPlaceholderConfigurer() {
      return new PropertySourcesPlaceholderConfigurer();
  }

public  String getInputPath() {
    return inputPath;
}

public  void setInputPath(String inputPath) {
    this.inputPath = inputPath;
}

public  String getOutputPath() {
    return outputPath;
}

public  void setOutputPath(String outputPath) {
    this.outputPath = outputPath;
}

}

Я получаю inputPath = null и outputPath = null.


Ответы:


1

Приведенный ниже код работает (я считаю, что у вас есть файл application.properties в src / main / resources):

            Properties properties = new Properties();
            InputStream file = null;
            try {
                file = GleBatchApplication.class.getClassLoader().getResourceAsStream("application.properties");
                properties.load(file);
            }catch(Exception e) {
                //exception handling
            }

Поместите его в свой основной метод, и вы сможете прочитать значения из переменной "properties". Как 2_

Или вы можете поместить приведенный выше код в другой класс и вызвать метод для получения свойств. ТАК, что вы можете использовать его где угодно.

26.03.2018
  • Привет, Гость. Это имеет смысл, я попробую сегодня и расскажу, как все прошло. Большое спасибо за ответ 26.03.2018
  • Оно работало завораживающе. Теперь я хотел бы передать пути ввода и вывода через CommandLineJobRunner и сохранить их в file.input и file.output application.properties. Как я могу этого добиться? Огромное спасибо заранее!!! 26.03.2018
  • @FedeLopez Я не знаю, почему вам нравится переопределять application.properties. Потому что вам снова нужно прочитать файл. Вместо этого прочтите аргументы командной строки в своем коде и установите аргументы как системные свойства, такие как System.setProperty (name, value); и чтобы получить его где угодно, используйте System.getProperty (name); Чтобы проанализировать аргументы командной строки, см. Примеры для org.apache.commons.cli.CommandLineParser 26.03.2018
  • Да, вы правы. Я путаю варианты, о которых думал. Один из них заключался в том, чтобы передать пути через командную строку в jobParameters и использовать их в приложении. Спасибо вам за помощь! 27.03.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..