An ItemReader, ItemWriter or ItemProcessor that itself implements one of the StepListener interfaces is registered automatically with the Step if using the namespace
element or one of the the *StepFactoryBean factories. Auszug aus https://docs.spring.io/spring-batch/4.1.x/reference/html/step.html#interceptingStepExecution
Wenn Sie einen Listener wie `` `StepExecutionListener``` in einer Implementierungsklasse wie ItemReader </ code> implementieren, wird dieser Listener ebenfalls automatisch registriert (zumindest für die Ausführung von Spring-Batch zusammen mit Spring-Boot). , Und das. Ich werde es vorerst versuchen.
Oder besser gesagt, ich war ein wenig überrascht, weil ich es nicht wusste, also habe ich eine Notiz hinterlassen.
pom.xml
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
ItemReader + StepExecutionListener
Erstellen Sie einen geeigneten Chunk-Prozess.
SampleChunk
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.StepExecutionListener;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.NonTransientResourceException;
import org.springframework.batch.item.ParseException;
import org.springframework.batch.item.UnexpectedInputException;
import org.springframework.stereotype.Component;
@Component
public class SampleChunk implements ItemReader<String>, ItemWriter<String>, StepExecutionListener {
@Override
public void write(List<? extends String> items) throws Exception {
items.forEach(s -> System.out.println(s));
}
int i=0;
@Override
public String read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
if (i<5) {
i++;
return i + "";
}
return null;
}
@Override
public void beforeStep(StepExecution stepExecution) {
System.out.println("beforeStep");
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
System.out.println("afterStep");
return stepExecution.getExitStatus();
}
}
Erstellen Sie eine entsprechende Schrittdefinition.
@Autowired
SampleChunk r2;
@Bean("chunkstep1")
public Step step1() {
StepExecutionListener s = new SampleChunk();
return stepBuilderFactory
.get("step1")
.<String, String>chunk(1)
.reader(r2)
.writer(r2)
.build();//.listener(s)
}
beforeStep
1
2
3
4
5
afterStep
Natürlich sind auch Zuhörer registriert.
Versuchen Sie, einen Listener wie unten gezeigt bei `` `listener``` zu registrieren.
@Bean("chunkstep1")
public Step step1() {
StepExecutionListener s = new SampleChunk();
return stepBuilderFactory
.get("step1")
.<String, String>chunk(1)
.reader(r2)
.writer(r2)
.listener(s)
.build();
}
beforeStep
beforeStep
1
2
3
4
5
afterStep
afterStep
Das ist doppelt.