在 Spring Batch 中重新启动分区步骤

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

我们的应用程序是在

openshift
中运行的 Spring 批处理。应用程序通过 REST 调用另一个服务来从数据库中获取记录。两者都使用
nginx
侧车来处理交通。两边的小车都因为某种原因重新启动,Spring批处理作业突然终止。我已经使用
@Retryable
实现了重试机制,但逻辑还没有到达重试部分。我在应用程序中找到的唯一日志如下

"Encountered an error executing step myPartitionStep in job myJob","level":"ERROR","thread":"main","logClass":"o.s.batch.core.step.AbstractStep","logMethod":"execute","stack_trace":"o.s.b.core.JobExecutionException: Partition handler returned an unsuccessful step
o.s.b.c.p.support.PartitionStep.doExecute(PartitionStep.java:112)
o.s.batch.core.step.AbstractStep.execute(AbstractStep.java:208)
o.s.b.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:152)
o.s.b.c.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:68)
o.s.b.c.j.f.s.state.StepState.handle(StepState.java:68)
o.s.b.c.j.f.support.SimpleFlow.resume(SimpleFlow.java:169)
o.s.b.c.j.f.support.SimpleFlow.start(SimpleFlow.java:144)
o.s.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:137)
o.s.batch.core.job.AbstractJob.execute(AbstractJob.java:320)
o.s.b.c.l.s.SimpleJobLauncher$1.run(SimpleJobLauncher.java:149)
o.s.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
o.s.b.c.l.s.SimpleJobLauncher.run(SimpleJobLauncher.java:140)
j.i.r.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java)
j.i.r.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
j.i.r.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:566)
o.s.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
o.s.a.f.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
o.s.a.f.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
o.s.b.c.c.a.SimpleBatchConfiguration$PassthruAdvice.invoke(SimpleBatchConfiguration.java:128)
... 13 frames truncated\n"

我无法指出此错误的确切原因是什么。它停在

partition
步骤,使用
itemReader
调用另一个服务并获取记录,
FlatFileItemWriter
写入记录。我们不能承受文件中出现重复的情况。是否可以在不重复的情况下准确地重新启动应用程序?

spring spring-boot spring-batch
1个回答
0
投票

您共享的堆栈跟踪已被截断,因此无法从您共享的内容中看到根本原因。

Spring Batch 支持重新启动失败的分区步骤,只要您使用持久作业存储库。您需要重新启动相同的作业实例,即使用您在第一次运行(失败)中使用的相同作业参数。只有失败的分区才会重新运行。任何失败的分区都将从中断处恢复。

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