Spring Batch JobRepository在单元测试中的事务问题

任何人都可以帮助我找出以下异常的解决方案,我想我只是不太了解事务传播机制,这阻碍了我理解下面显示的异常消息的真实含义,所以请帮助我理解整个问题事情,的确非常感谢!

java.lang.IllegalStateException: Existing transaction detected in JobRepository. Please fix this and try again (e.g. remove @Transactional annotations from client).

at org.springframework.batch.core.repository.support.AbstractJobRepositoryFactoryBean$1.invoke(AbstractJobRepositoryFactoryBean.java:164)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)

at com.sun.proxy.$Proxy15.createJobExecution(Unknown Source)

at org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:111)

at TestJob.testExcelParserTasklet(TestJob.java:36)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)

at org.testng.internal.MethodInvocationHelper$1.runTestMethod(MethodInvocationHelper.java:169)

at org.springframework.test.context.testng.AbstractTestNGSpringContextTests.run(AbstractTestNGSpringContextTests.java:158)

这是导致上述异常的代码:

public class TestJob extends BaseTest {

@Test

public void testExcelParserTasklet() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, NoSuchJobException {

Job job = jobRegistry.getJob("parseExcelJob");

jobLauncher.run(job, new JobParameters());

}

}

这是BaseTest:

@ContextConfiguration("classpath:application-context.xml")

public abstract class BaseTest extends AbstractTransactionalTestNGSpringContextTests

{

@Autowired

protected JobRegistry jobRegistry;

@Autowired

protected JobLauncher jobLauncher;

}

回答:

AbstractTransactionalTestNGSpringContextTests将所有测试方法包装在事务中。Spring批处理作业存储库不喜欢与他人共享其事务管理器。逻辑很简单,如果您在步骤失败时与步骤事务管理器共享作业事务管理器,它将回退步骤和写入作业存储库的数据。这意味着您将不会保留数据以重新启动作业。因此,使用事务性单元测试非常棘手。

看4.3.1节。Spring

Batch文档的JobRepository的事务配置。

我们也遇到了这个问题,因此我们避免事务性测试,直到找到解决方案为止。可以使用乘法事务管理器,但是我还没有尝试过,请参见如何使用Spring +

DBUnit + JUnit配置多事务管理器

以上是 Spring Batch JobRepository在单元测试中的事务问题 的全部内容, 来源链接: utcz.com/qa/419570.html

回到顶部