Учитывая, что у меня есть эта конфигурация Spring Batch для моего задания рабочего процесса, и я использую базу данных Sql Server для своих весенних пакетных таблиц:
public class MyConfiguration extends AbstractConfiguration {
@Bean
@Qualifier("pollStep")
public Step pollStep() {
return stepBuilderFactory.get("pollStep")
.tasklet(filePollingTasklet())
.listener(promoteContextListener())
.build();
}
@Bean
@StepScope
private Tasklet filePollingTasklet() {
return ((stepContribution, chunkContext) -> getStatus(stepContribution, chunkContext));
}
private RepeatStatus getStatus(StepContribution stepContribution, ChunkContext chunkContext) {
//some code
Map<String, Boolean> result = poller.pollForFile(myContext, sourceInfo);
return RepeatStatus.FINISHED;
}
}
Мое приложение опрашивает файл на удаленном сервере. Через 100 минут, когда он не может найти файл, poller.pollForFile()
выдает исключение времени выполнения, и мой статус шага НЕИЗВЕСТЕН, и приложение завершает работу с исключениями:
c.m.s.j.SQLServerException: Connection reset at
c.m.s.j.SQLServerConnection.terminate(SQLServerConnection.java:1667) at
c.m.s.j.SQLServerConnection.terminate(SQLServerConnection.java:1654) at
c.m.s.j.TDSChannel.write(IOBuffer.java:1805) at c.m.s.jdbc.TDSWriter.flush(IOBuffer.java:3581) at
c.m.s.jdbc.TDSWriter.writePacket(IOBuffer.java:3482) at
c.m.s.jdbc.TDSWriter.endMessage(IOBuffer.java:3062) at
c.m.s.j.TDSCommand.startResponse(IOBuffer.java:6120) at
c.m.s.j.TDSCommand.startResponse(IOBuffer.java:6106) at
c.m.s.j.SQLServerConnection$1ConnectionCommand.doExecute(SQLServerConnection.java:1756) at
c.m.s.j.TDSCommand.execute(IOBuffer.java:5696) at
c.m.s.j.SQLServerConnection.executeCommand(SQLServerConnection.java:1715) at
c.m.s.j.SQLServerConnection.connectionCommand(SQLServerConnection.java:1761) at
c.m.s.j.SQLServerConnection.rollback(SQLServerConnection.java:1964) at
c.z.h.p.ProxyConnection.rollback(ProxyConnection.java:375) at
c.z.h.p.HikariProxyConnection.rollback(HikariProxyConnection.java) at
o.h.r.j.i.AbstractLogicalConnectionImplementor.rollback(AbstractLogicalConnectionImplementor.java:116) ... 50 common frames omitted Wrapped by: u003c#7f0e356au003e o.h.TransactionException: Unable to rollback against JDBC Connection at ...
Я думаю, что время подключения к базе данных сервера sql истекло и закрыто, а весенний пакет не может выполнять откат и обновления базы данных. В идеале я хочу, чтобы статус был FAILED, что происходит, когда я запускаю локально с H2, но в этом случае, какую стратегию или методы я могу использовать для решения этой проблемы? В сообщении о выходе нет ошибки из-за исключения, вызванного pollForFile()
, вместо этого org.springframework.transaction.TransactionSystemException: Could not roll back JPA transaction; nested exception is org.hibernate.TransactionException: Unable to rollback against JDBC Connectionat
Есть ли способ решить эту проблему? Что, если бы я перешел от тасклета к ориентированному на фрагменты и выполнил логику опроса в методе read()
ItemReader?