Когда мой itemearder.read () бросает исключение, шаг помечен ошибкой .
В моем послеэтэп прослушивание я пытаюсь переопределить его с помощью:
stepExecution.setStatus(BatchStatus.COMPLETED);
stepExecution.setExitStatus(ExitStatus.COMPLETED);
Это делает шаг -показ как завершенное в репозитории, но в потоке задания JobExecutionDecider по -прежнему получает исходную неудачу exitStatus .
Как я могу сделать переопределенный exitStatus PRECLEARLY, так что это выплат (так, что это вытекает (так же, что выплат (так же, что выплат (так, что они обращаются (так, что выплатите, так, что они выплачивают (так, что выплата (так, что выплата (так же, что вытекает на трансферы, так же, что трансфер.
Код: Выделить всё
on("*")Я экспериментирую с пружинной партией и пытаюсь переопределить состояние выхода шага, когда itemreader.read () метод не удается.
Код: Выделить всё
package com.mdp.mayaanonymizationengine;
import com.mdp.mayaanonymizationengine.core.AbstractDatabaseProperty;
import com.mdp.mayaanonymizationengine.core.IntegrationTest;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.batch.core.*;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.job.flow.FlowExecutionStatus;
import org.springframework.batch.core.job.flow.JobExecutionDecider;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.step.builder.StepBuilder;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemStream;
import org.springframework.batch.item.ItemStreamException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.PlatformTransactionManager;
@Slf4j
@IntegrationTest
class BatchTest extends AbstractDatabaseProperty {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private PlatformTransactionManager transactionManager;
@Autowired
private JobRepository jobRepository;
@Test
void testStepFailureOverriddenToCompleted() throws Exception {
jobLauncher.run(
testJob(jobRepository, transactionManager),
new JobParameters()
);
}
public Job testJob(JobRepository jobRepository,
PlatformTransactionManager transactionManager) {
return new JobBuilder("testJob", jobRepository)
.start(failingStep(jobRepository, transactionManager))
.on("*").to(decider())
.end()
.build();
}
public Step failingStep(JobRepository jobRepository,
PlatformTransactionManager transactionManager) {
return new StepBuilder("failingStep", jobRepository)
.chunk(1, transactionManager)
.reader(new TestBatchReader())
.writer(items -> {
// no-op
})
.listener(new StepExecutionListener() {
@Override
public void beforeStep(StepExecution stepExecution) { }
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
System.out.println("afterStep called, overriding status to COMPLETED");
// Force batch + exit status
stepExecution.setStatus(BatchStatus.COMPLETED);
stepExecution.setExitStatus(ExitStatus.COMPLETED);
return ExitStatus.COMPLETED;
}
})
.build();
}
public JobExecutionDecider decider() {
return (JobExecution jobExecution, StepExecution stepExecution) -> {
System.out.println("Decider saw exit status: " + stepExecution.getExitStatus());
return FlowExecutionStatus.COMPLETED;
};
}
static class TestBatchReader implements ItemReader, ItemStream {
@Override
public void open(ExecutionContext executionContext) throws ItemStreamException {
log.info("Reader open called");
}
@Override
public String read() {
throw new RuntimeException("Simulated reader failure!");
}
}
}
- Читатель бросает runtimeexception .
- extepteptepe к коду. Завершен .
- В журналах задание заканчивается с batchstatus = завершен , как и ожидалось. Исключение.
Как я могу надежно переопределить методы exitStatus шага, когда itemreader.read () (или сходные методы, такие как процесс /write
Подробнее здесь: https://stackoverflow.com/questions/797 ... rows-an-ex