Как решить исключение "java .lang.IllegalArgumentException: Invalid TaskExecution, ID 3" при запуске задачи из SCDF? - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь запустить пакетную банку Spring через SCDF. Я использую разные источники данных для чтения и записи (оба Oracle БД). Источник данных, который я использую для записи, является основным источником данных. Я использую Custom Build SCDF для включения oracle зависимостей драйвера. Ниже приведено расположение пользовательского проекта SCDF.

dataflow-server-22x

В моем локальном пакетном проекте Spring я реализовал DefaultTaskConfigurer, чтобы предоставить мой основной источник данных. Поэтому, когда я запускаю пакетный проект из IDE, проект работает нормально, и он читает записи из вторичного источника данных и записывает их в первичный источник данных. Но когда я развертываю пакетную флягу для пользовательской сборки SCDF как задачи и запускаю ее, я получаю сообщение об ошибке:

org.springframework.context.ApplicationContextException: Failed to start bean 'taskLifecycleListener'; nested exception is java.lang.IllegalArgumentException: Invalid TaskExecution, ID 3 not found

Когда я проверял таблицу выполнения задачи (к которой можно получить доступ через первичный источник данных), идентификатор выполнения задачи находится в таблице. Но все же я получаю эту ошибку. Для каждого запуска новый идентификатор задачи вставляется в таблицу Task_execution, но я получаю вышеуказанное сообщение об ошибке с недавно вставленным идентификатором task_execution. Ниже приведены особенности проекта:

Spring-boot-starter-parent : 2.2.5.RELEASE.
Spring-cloud-dataflow : 2.2.0.RELEASE.

Я загружаю все свои Batch_jobs из основного класса Boot, используя экземпляр класса пакетных заданий, и только основной класс (который запускает все задания) содержит аннотацию @EnableTask. Ниже приведена структура моего класса.

    @SpringBootApplication
    @EnableScheduling
    @EnableTask
    public class SpringBootMainApplication{
        @Autowired
        Job1Loader job1Loader;

        public static void main(String[] args) {
            SpringApplication.run(SpringBootMainApplication.class, args);
        }

        @Scheduled(cron = "0 */1 * * * ?")
        public void executeJob1Loader() throws Exception
        {
            JobParameters param = new JobParametersBuilder()
                                        .addString("JobID",         
                                     String.valueOf(System.currentTimeMillis()))
                                        .toJobParameters();
            jobLauncher.run(job1Loader.loadJob1(), param);
        }
    }

    //Job Config
    @Configuration
    @EnableBatchProcessing
    public class Job1Loader {
    @Bean
        public Job loadJob1()
        {
            return jobBuilderFactory().get("JOb1Loader")
                .incrementer(new RunIdIncrementer())
                .flow(step01())
                .end()
                .build();;//return job
    }

Я использую два разных источника данных в своем проекте работы Spring, оба являются oracle источником данных (разные серверы). Я отметил один из них как основной и использовал этот источник данных в своем Пользовательская реализация "DefaultTaskConfigurer", как показано ниже.

@Configuration
public class TaskConfig extends DefaultTaskConfigurer {
    @Autowired
    DatabaseConfig databaseConfig; 
    @Override
    public DataSource getTaskDataSource() {
        return databaseConfig.dataSource();//dataSource() returns the 
primary ds
    }
}

Ниже приведены свойства, которые я использую как в пользовательском анализаторе SCDF, так и в проекте Spring Batch.

UPDATE - 1

**Spring batch Job :**
 spring.datasource.jdbc-url=jdbc:oracle:thin:@**MY_PRIMARY_DB**
 spring.datasource.username=db_user
 spring.datasource.password=db_pwd
 spring.datasource.driver-class-name=oracle.jdbc.OracleDriver

spring.datasource.jdbc-url=jdbc:oracle:thin:@**MY_SECONDARY_DB**
 spring.datasource.username=db_user
 spring.datasource.password=db_pwd
 spring.datasource.driver-class-name=oracle.jdbc.OracleDriver

**SCDF custom Server:**
 spring.datasource.url=jdbc:oracle:thin:@**MY_PRIMARY_DB**
 spring.datasource.username=db_user
 spring.datasource.password=db_pwd
 spring.datasource.driver-class-name=oracle.jdbc.OracleDriver

Приложение My Batch использует две конфигурации дБ. один читать и один писать. Потому что источник и назначение разные. Поскольку таблицы TASK_EXECUTION были созданы в базе данных MY_PRIMARY_DB , я передаю только основную конфигурацию дБ для чтения и записи в SCDF. Поскольку чтение и запись происходят в одной и той же БД.

Я пытался найти другие ответы на этот вопрос, но ни один не помог. И, как я сказал ранее, любой вклад по этому вопросу будет очень полезен. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...