@Test
public void testLockNotReleasedIfChunkFails() throws Exception {
configureStep(new TaskletStep("step") {
@SuppressWarnings("serial")
@Override
protected Semaphore createSemaphore() {
return new Semaphore(1) {
private boolean locked = false;
@Override
public void acquire() throws InterruptedException {
locked = true;
}
@Override
public void release() {
assertTrue("Lock released before it is acquired", locked);
}
};
}
});
step.setTasklet(new TestingChunkOrientedTasklet<>(new ItemReader<Object>() {
@Override
public Object read() throws Exception {
throw new RuntimeException("Planned!");
}
}, itemWriter));
jobRepository.add(stepExecution);
step.execute(stepExecution);
assertEquals("Planned!", stepExecution.getFailureExceptions().get(0).getMessage());
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
}