Spring Batch: transmettre des données entre le lecteur et l'écrivain
Je voudrais obtenir les données de l'Écrivain que je l'ai mis dans le Lecteur de mon étape. Je sais que sur ExecutionContexts (de l'étape et de l'emploi) et sur ExecutionContextPromotionListener via http://docs.spring.io/spring-batch/trunk/reference/html/patterns.html#passingDataToFutureSteps
Le problème est que, dans l'Écrivain, je suis de la récupération d'une valeur nulle de "gnap'.
Ligne sur ItemWriter:
LOG.info("INSIDE WRITE, NPAG: " + nPag);
J'ai fait quelques solutions de contournement, mais sans succès, à la recherche de réponses pour d'autres des questions similaires... Toute aide? merci!
Voici mon code:
LECTEUR
@Component
public class LCItemReader implements ItemReader<String> {
private StepExecution stepExecution;
private int nPag = 1;
@Override
public String read() throws CustomItemReaderException {
ExecutionContext stepContext = this.stepExecution.getExecutionContext();
stepContext.put("npag", nPag);
nPag++;
return "content";
}
@BeforeStep
public void saveStepExecution(StepExecution stepExecution) {
this.stepExecution = stepExecution;
}
}
ÉCRIVAIN
@Component
@StepScope
public class LCItemWriter implements ItemWriter<String> {
private String nPag;
@Override
public void write(List<? extends String> continguts) throws Exception {
try {
LOG.info("INSIDE WRITE, NPAG: " + nPag);
} catch (Throwable ex) {
LOG.error("Error: " + ex.getMessage());
}
}
@BeforeStep
public void retrieveInterstepData(StepExecution stepExecution) {
JobExecution jobExecution = stepExecution.getJobExecution();
ExecutionContext jobContext = jobExecution.getExecutionContext();
this.nPag = jobContext.get("npag").toString();
}
}
TRAVAIL/ÉTAPE DE LOT CONFIG
@Bean
public Job lCJob() {
return jobs.get("lCJob")
.listener(jobListener)
.start(lCStep())
.build();
}
@Bean
public Step lCStep() {
return steps.get("lCStep")
.<String, String>chunk(1)
.reader(lCItemReader)
.processor(lCProcessor)
.writer(lCItemWriter)
.listener(promotionListener())
.build();
}
AUDITEUR
@Bean
public ExecutionContextPromotionListener promotionListener() {
ExecutionContextPromotionListener executionContextPromotionListener = new ExecutionContextPromotionListener();
executionContextPromotionListener.setKeys(new String[]{"npag"});
return executionContextPromotionListener;
}
- Injecter de l'exécution étape par étape dans l'écrivain et de lire gnap au cours de l'écriture()
Vous devez vous connecter pour publier un commentaire.
La ExecutionContextPromotionListener stipule expressément qu'il fonctionne à la fin d'une étape, donc, qui serait d'après l'écrivain s'exécute. Si la promotion, je pense que vous comptez sur de ne pas se produire lorsque vous pensez que cela fonctionne.
Si j'étais vous, je mettrais ça dans le contexte d'étape et d'obtenir à partir de l'étape si vous avez besoin de la valeur en une seule étape. Sinon j'aurais mis à la tâche contexte.
L'autre aspect est l' @BeforeStep. Qui marque une méthode pour l'exécution avant l'étape de contexte. La façon dont vous définissez le gnap valeur dans le lecteur serait d'après cette étape a commencé à s'exécuter.
Que vous essayez de lire la valeur de gnap avant même qu'il est défini dans le lecteur, de se retrouver avec une valeur par défaut est null. Vous avez besoin de lire la valeur sur gnap au moment de l'enregistrement à partir du contexte d'exécution directement. Vous pouvez garder une référence à la "job context". Essayez cette
Dans votre Lecteur et l'Écrivain, vous devez mettre en œuvre ItemStream interface et l'utilisation ExecutionContext comme variable membre.Ici, j'ai donné l'exemple avec Processeur à la place de l'Écrivain mais la même chose est applicable pour l'Écrivain aussi bien .Sa fonctionne très bien pour moi et je suis capable de prendre des valeurs de lecteur de processeur.
J'ai mis la valeur dans le contexte du lecteur et l'obtention de la valeur dans le processeur.
Mon processeur
Espère que cette aide.