Приложение запускается каждую минуту (для моего тестирования), и мне не требуется сохранять метаданные пакета после завершения задания. Поэтому я написал CustomJobListener для очистки таблиц после каждого запуска задания.
Код: Выделить всё
@Slf4j
@Component
public class CustomJobExecutionListener implements JobExecutionListener {
Map emptyMap = new HashMap();
@Autowired
@Qualifier("jdbcTemplateH2")
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
@Override
public void afterJob(JobExecution jobExecution) {
JobExecutionListener.super.afterJob(jobExecution);
log.info("Job completed, will delete table metadata---");
namedParameterJdbcTemplate.update("DELETE FROM BATCH_STEP_EXECUTION_CONTEXT", emptyMap);
namedParameterJdbcTemplate.update("DELETE FROM BATCH_STEP_EXECUTION", emptyMap);
namedParameterJdbcTemplate.update("DELETE FROM BATCH_JOB_EXECUTION_CONTEXT", emptyMap);
namedParameterJdbcTemplate.update("DELETE FROM BATCH_JOB_EXECUTION_PARAMS", emptyMap);
namedParameterJdbcTemplate.update("DELETE FROM BATCH_JOB_EXECUTION", emptyMap);
namedParameterJdbcTemplate.update("DELETE FROM BATCH_JOB_INSTANCE", emptyMap);
log.info("---------------------Metadata from all tables deleted successfully---------------------------");
}
}
Код: Выделить всё
Executing prepared SQL statement [SELECT VERSION\nFROM BATCH_JOB_EXECUTION\nWHERE JOB_EXECUTION_ID=?\n]","logger_name":"org.springframework.jdbc.core.JdbcTemplate","thread_name":"scheduling-1","level":"DEBUG","level_value":10000}
{"@timestamp":"2024-09-18T21:13:25.8614103+05:30","@version":"1","message":"Initiating transaction rollback","logger_name":"org.springframework.orm.jpa.JpaTransactionManager","thread_name":"scheduling-1","level":"DEBUG","level_value":10000}
{"@timestamp":"2024-09-18T21:13:25.8614103+05:30","@version":"1","message":"Rolling back JPA transaction on EntityManager [SessionImpl(1440235680)]","logger_name":"org.springframework.orm.jpa.JpaTransactionManager","thread_name":"scheduling-1","level":"DEBUG","level_value":10000}
{"@timestamp":"2024-09-18T21:13:25.8614103+05:30","@version":"1","message":"Closing JPA EntityManager [SessionImpl(1440235680)] after transaction","logger_name":"org.springframework.orm.jpa.JpaTransactionManager","thread_name":"scheduling-1","level":"DEBUG","level_value":10000}
{"@timestamp":"2024-09-18T21:13:25.8614103+05:30","@version":"1","message":"Job: [FlowJob: [name=learnSpringBatch]] failed unexpectedly and fatally with the following parameters: [{'JobID':'{value=1153310559084400, type=class java.lang.String, identifying=true}'}]","logger_name":"org.springframework.batch.core.launch.support.SimpleJobLauncher","thread_name":"scheduling-1","level":"INFO","level_value":20000,"stack_trace":"org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
[img]https://i.sstatic.net /cWOzk7Jg.png[/img]
который вызывает обновление в SimpleJobRepository

который вызывает запрос в журналах

Поскольку таблицы уже были очищены (усечены) в CustomJobListener, ожидается ошибка, но ошибка в журналах: "Job: [ FlowJob: [name=learnSpringBatch]] неожиданно и фатально завершился сбой со следующими параметрами: [{'JobID':'{value=1153310559084400, type=class java.lang.String, идентификация=true} '}]","logger_name":"org.springframework.batch.core.launch.support.SimpleJobLauncher","thread_name":"scheduling-1","level":"INFO","level_value":20000," stack_trace":"org.springframework.dao.EmptyResultDataAccessException: Неправильный размер результата: ожидаемый 1, фактический 0" заставляет меня задуматься, правильно ли я это делаю.
Можно ли игнорировать ошибку?
Правильно ли я делаю?
Подробнее здесь: https://stackoverflow.com/questions/789 ... correct-re