使用 spring batch5 和 boot 3.x 和 java17,我尝试启动批处理作业,但在查询引导应用程序时未创建的表时失败。
2023-11-01 09:20:07.566 错误 [http-nio-9344-exec-2] 错误 - 捕获 通用异常org.springframework.jdbc.UncategorizedSQLException: 准备语句回调; SQL 的未分类 SQLException [SELECT JOB_INSTANCE_ID、JOB_NAME 来自 BATCH_JOB_INSTANCE,其中 JOB_NAME = ? 和 JOB_KEY = ?]; SQL状态[S0002];错误代码[208];无效的 对象名称“BATCH_JOB_INSTANCE”。在 org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1581)
原因:com.microsoft.sqlserver.jdbc.SQLServerException:无效 对象名称“BATCH_JOB_INSTANCE”。在 com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:262)
我尝试使用以下配置类和属性。我期待如何自动创建 Spring Batch 元数据表。
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Bean
public TaskExecutorJobLauncher simpleJobLauncher(JobRepository jobRepository) {
TaskExecutorJobLauncher jobLauncher = new TaskExecutorJobLauncher();
jobLauncher.setJobRepository(jobRepository);
jobLauncher.setTaskExecutor(simpleAsyncTaskExecutor());
return jobLauncher;
}
@Bean
public JobOperator jobOperator(JobRepository jobRepository, JobExplorer jobExplorer, JobRegistry jobRegistry) {
SimpleJobOperator jobOperator = new SimpleJobOperator();
jobOperator.setJobLauncher(simpleJobLauncher(jobRepository));
jobOperator.setJobExplorer(jobExplorer);
jobOperator.setJobRegistry(jobRegistry);
jobOperator.setJobRepository(jobRepository);
return jobOperator;
}
@Bean
public JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor(JobRepository jobRepository,
JobRegistry jobRegistry) {
JobRegistryBeanPostProcessor postProcessor = new JobRegistryBeanPostProcessor();
postProcessor.setJobRegistry(jobRegistry);
return postProcessor;
}
private SimpleAsyncTaskExecutor simpleAsyncTaskExecutor() {
SimpleAsyncTaskExecutor simpleAsyncTaskExecutor = new SimpleAsyncTaskExecutor(
CollateralBatchConstants.EXECUTOR_THREAD_NAME_PREFIX);
simpleAsyncTaskExecutor.setConcurrencyLimit(1);
return simpleAsyncTaskExecutor;
}
}
@Configuration
public class JobConfiguration {
@Autowired
private AccountStatusReader accountStatusReader;
@Autowired
private AccountStatusProcessor accountStatusProcessor;
@Autowired
private AccountStatusWriter accountStatusWriter;
@Autowired
private Step odiJobStatusStep;
@Autowired
private Step collateralBatchStep;
@Bean
public Job collateralBatchJob(JobRepository jobRepository) {
return new JobBuilder(CollateralBatchConstants.COLLATERAL_BATCH_JOB, jobRepository).incrementer(new RunIdIncrementer())
.start(odiJobStatusStep).next(collateralBatchStep).build();
}
@Bean
public Step odiJobStatusStep(JobRepository jobRepository, Tasklet tasklet, PlatformTransactionManager transactionManager) {
return new StepBuilder(CollateralBatchConstants.ODI_JOB_STEP, jobRepository).tasklet(tasklet, transactionManager).build();
}
@Bean
public Step collateralBatchStep(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new StepBuilder(CollateralBatchConstants.COLLATERAL_BATCH_STEP, jobRepository)
.<CollateralStagingLoanAccountStatus, AccountStatusUpdateResponse>chunk(1000, transactionManager)
.reader(accountStatusReader).processor(accountStatusProcessor).writer(accountStatusWriter).build();
}
}
使用上面的代码,我将使用下面的代码开始批处理作业。
长jobId = jobOperator.start(collateralBatchJob.getName(), props);
我正在尝试以下属性。
spring.batch.initialize-schema=ALWAYS
spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.url=
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.database-platform=org.hibernate.dialect.SQLServerDialect
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=update
它正在尝试查询数据库并使用“BATCH_JOB_INSTANCE”表且不可用。
如何解决。
@EnableBatchProcessing 现在不鼓励使用,删除它并尝试。