Я пытаюсь запустить пакетную банку 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. Поскольку чтение и запись происходят в одной и той же БД.
Я пытался найти другие ответы на этот вопрос, но ни один не помог. И, как я сказал ранее, любой вклад по этому вопросу будет очень полезен. Спасибо.