gpt4 book ai didi

Spring Batch 'RunIdIncrementer' 未生成下一个值

转载 作者:行者123 更新时间:2023-12-04 18:09:29 24 4
gpt4 key购买 nike

我有几个 Spring Batch (2.1.9.RELEASE) 作业在生产中运行,它们使用 org.springframework.batch.core.launch.support.RunIdIncrementer

偶尔,我会收到以下错误:

org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException: A job instance already exists and is complete for parameters={run.id=23, tenant.code=XXX}.  If you want to run this job again, change the parameters.
at org.springframework.batch.core.repository.support.SimpleJobRepository.createJobExecution(SimpleJobRepository.java:122) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_39]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_39]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_39]
at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_39]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318) ~[spring-aop-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) ~[spring-aop-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) ~[spring-aop-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) ~[spring-tx-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.batch.core.repository.support.AbstractJobRepositoryFactoryBean$1.invoke(AbstractJobRepositoryFactoryBean.java:168) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) ~[spring-aop-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) ~[spring-aop-3.1.1.RELEASE.jar:3.1.1.RELEASE]
at sun.proxy.$Proxy64.createJobExecution(Unknown Source) ~[na:na]
at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:111) ~[spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.launch.support.CommandLineJobRunner.start(CommandLineJobRunner.java:349) [spring-batch-core-2.1.9.RELEASE.jar:na]
at org.springframework.batch.core.launch.support.CommandLineJobRunner.main(CommandLineJobRunner.java:574) [spring-batch-core-2.1.9.RELEASE.jar:na]
at (omitted for brevity)

来自各种 XML 上下文的示例:

<bean
id="jobParametersIncrementer"
class="org.springframework.batch.core.launch.support.RunIdIncrementer" />

<batch:job id="rootJob"
abstract="true"
restartable="true">
<batch:validator>
<bean class="org.springframework.batch.core.job.DefaultJobParametersValidator">
<property name="requiredKeys" value="tenant.code"/>
</bean>
</batch:validator>
</batch:job>

<batch:job id="rootJobWithIncrementer"
abstract="true"
parent="rootJob"
incrementer="jobParametersIncrementer" />

我使用 org.springframework.batch.core.launch.support.CommandLineJobRunner 来执行作业:

java org.springframework.batch.core.launch.support.CommandLineJobRunner /com/XXX/job123/job123-context.xml job123 tenant.code=XXX -next 

所有作业(使用增量器)都将 rootJobWithIncrementer 作为父作业。

我做了相当多的研究,发现一些遇到这个错误的人成功地改变了事务管理器的隔离级别。我摆弄了几个级别,最后到达了 READ_COMMITED

<batch:job-repository
id="jobRepository"
data-source="oracle_hmp"
transaction-manager="dataSourceTransactionManager"
isolation-level-for-create="READ_COMMITTED"/>

根据我的理解,只有在相同作业从多个进程在相同时间执行时才会发生这种类型的错误——因此可能存在争用对于增量器。在本例中,情况不是,但我们看到了错误。

关于可能导致此问题的原因有什么想法吗?我应该尝试不同的隔离级别吗?还有别的吗?

谢谢!

有个类似的问题here ,但它没有很好的记录(也缺乏答案)。

最佳答案

这可能是一个远景,但我花了很长时间才弄清楚,因为唯一的症状是偶尔出现 JobInstanceAlreadyCompleteException,正如您所描述的,所以我想我建议这样做。

我使用的数据库是 Oracle,我创建的 BATCH_JOB_SEQBATCH_JOB_EXECUTION_SEQCACHE_SIZE 都是 10。

这有时会导致 JOB_INSTANCE_IDJOB_EXECUTION_ID 无法正确排序。 Spring Batch 假设最近的 JOB_INSTANCE 是具有 max(JOB_INSTANCE_ID) 的那个(参见 org.springframework.batch.core.repository.dao.JdbcJobInstanceDao .FIND_LAST_JOBS_BY_NAME)。由于我的顺序有时会被打乱,这个假设并不总是成立。

我通过将序列设置为 NO_CACHE 来修复它。

判断这是否是您的问题的一种简单方法是检查您的序列是否完全设置为缓存和/或确保您的JOB_INSTANCE_IDJOB_EXECUTION_ID 总是随着每次新的运行而上升。

关于Spring Batch 'RunIdIncrementer' 未生成下一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17975917/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com