Spring Batch 5.x,无法在数据库(sqlserver)中创建元数据表

问题描述 投票:0回答:1

使用 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”表且不可用。

如何解决。

spring-batch java-17 spring-boot-3
1个回答
0
投票

@EnableBatchProcessing 现在不鼓励使用,删除它并尝试。

© www.soinside.com 2019 - 2024. All rights reserved.