Code: Select all
@Configuration
@EnableScheduling
@FieldDefaults(level = PRIVATE, makeFinal = true)
@RequiredArgsConstructor
public class BatchConfiguration {
BatchProperties properties;
OrderService orderService;
@Bean
public Job updateOrderStatusJob(JobRepository jobRepository, PlatformTransactionManager platformTransactionManager) {
Step updateOrderStatusStep = new StepBuilder("updateOrderStatusStep", jobRepository)
.tasklet(orderStatusUpdateTasklet(), platformTransactionManager)
.build();
return new JobBuilder(properties.getJob().getName(), jobRepository)
.start(updateOrderStatusStep)
.listener(orderStatusUpdateJobListener())
.build();
}
@Bean
public Tasklet orderStatusUpdateTasklet() {
return new OrderStatusUpdateTasklet(orderService);
}
@Bean
public JobExecutionListener orderStatusUpdateJobListener() {
return new OrderStatusUpdateJobListener();
}
@Bean
public OrderStatusUpdateJobScheduler orderStatusUpdateJobScheduler(JobLauncher jobLauncher, Job job) {
return new OrderStatusUpdateJobScheduler(jobLauncher, job);
}
}
< /code>
ordnerStatusUpDatetasklet < /p>
@FieldDefaults(level = PRIVATE, makeFinal = true)
@RequiredArgsConstructor
public class OrderStatusUpdateTasklet implements Tasklet {
OrderService orderService;
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
LocalDateTime tenMinutesAgo = LocalDateTime.now().minusMinutes(10);
List orders = orderService.getAllOrders();
List updatedOrders = new ArrayList();
for (Order order : orders) {
if (order.getCreatedAt().isBefore(tenMinutesAgo) && order.getIsActive()) {
order.setIsActive(false);
updatedOrders.add(order);
}
}
orderService.saveOrders(updatedOrders);
return FINISHED;
}
}
< /code>
ordnerStatusUpdatejobScheduler < /p>
@FieldDefaults(level = PRIVATE, makeFinal = true)
@Slf4j
@RequiredArgsConstructor
public class OrderStatusUpdateJobScheduler {
private static final int TEN_SECONDS = 10000;
JobLauncher jobLauncher;
Job updateOrderStatusJob;
@Scheduled(fixedDelay = TEN_SECONDS)
public void launchStatusUpdateJob() {
try {
jobLauncher.run(updateOrderStatusJob, new JobParameters());
} catch (Exception e) {
log.error("Error launching order status update job", e);
}
}
}
< /code>
Application.yml
server:
port: ${BT_PORT:8080}
spring:
name: spring-boot-batch-test
config:
import:
- classpath:application-db.yml
- classpath:application-batch.yml
< /code>
Application-Batch.yml
spring:
batch:
job:
name: update-order-status
jdbc:
initialize-schema: always
table-prefix: MY_CUSTOM_BATCH_
< /code>
Application-db.yml
spring:
datasource:
url: ${DB_URL:jdbc:postgresql://localhost:5432/spring_batch_test}
username: ${DB_USERNAME:spring_batch_test}
password: ${DB_PASSWORD}
driver-class-name: ${DB_DRIVER:org.postgresql.Driver}
hikari:
pool-name: spring-batch-hikari-db-pool
connection-timeout: 30000
maximum-pool-size: 10
jpa:
hibernate:
ddl-auto: ${DB_HIBERNATE_DDL_AUTO:update}
dialect: ${DB_HIBERNATE_DIALECT:org.hibernate.dialect.PostgreSQLDialect}
< /code>
Meine POM -Datei: < /p>
4.0.0
org.springframework.boot
spring-boot-starter-parent
3.3.5
spring-boot-batch-test
21
21
UTF-8
org.springframework.boot
spring-boot-starter-web
3.3.5
org.springframework.boot
spring-boot-starter-data-jpa
3.3.5
org.springframework.boot
spring-boot-starter-batch
3.3.5
org.projectlombok
lombok
1.18.36
org.postgresql
postgresql
42.7.4
runtime
< /code>
Ich versuche, Stapeljob mit Tabellen zu erstellen, die mit "my_custom_batch_" vorangestellt sind. Aber meine Anwendung konnte nicht gestartet werden.2025-02-13T12:07:59.928+06:00 ERROR 32268 --- [ scheduling-1] .n.m.b.e.j.OrderStatusUpdateJobScheduler : Error launching order status update job
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT JOB_INSTANCE_ID, JOB_NAME
FROM MY_CUSTOM_BATCH_JOB_INSTANCE
WHERE JOB_NAME = ?
and JOB_KEY = ?]
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:112) ~[spring-jdbc-6.1.14.jar:6.1.14]
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107) ~[spring-jdbc-6.1.14.jar:6.1.14]
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:116) ~[spring-jdbc-6.1.14.jar:6.1.14]
...
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na]
at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
Caused by: org.postgresql.util.PSQLException: ERROR: relation "my_custom_batch_job_instance" does not exist
- Position: 39
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2733) ~[postgresql-42.7.4.jar:42.7.4]
com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) ~[HikariCP-5.1.0.jar:na]
at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:732) ~[spring-jdbc-6.1.14.jar:6.1.14]
...
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:658) ~[spring-jdbc-6.1.14.jar:6.1.14]
... 33 common frames omitted
2025-02-13T12:07:59.956+06:00 ERROR 32268 --- [ main] o.s.boot.SpringApplication : Application run failed
< /code>
Derzeit erstellt meine Anwendung Tabellen, jedoch ohne die Präfixe: < /p>
docker exec -it postgres16 psql -U spring_batch_test
psql (16.6 (Debian 16.6-1.pgdg120+1))
Type "help" for help.
spring_batch_test=> \dt
List of relations
Schema | Name | Type | Owner
--------+------------------------------+-------+-------------------
public | batch_job_execution | table | spring_batch_test
public | batch_job_execution_context | table | spring_batch_test
public | batch_job_execution_params | table | spring_batch_test
public | batch_job_instance | table | spring_batch_test
public | batch_step_execution | table | spring_batch_test
public | batch_step_execution_context | table | spring_batch_test
public | orders | table | spring_batch_test
(7 rows)
spring_batch_test=>