Ottieni il nome della risorsa corrente usando MultiResourceItemReader Spring batch

Sto usando MultiResourceItemReader in Spring Batch per la lettura di più file XML e voglio ottenere risorse attuali. MultiResourceItemReader è la mia configurazione:

 public class MultiFileResourcePartitioner extends MultiResourceItemReader { @Override public void update(final ExecutionContext pExecutionContext) throws ItemStreamException { super.update(pExecutionContext); if (getCurrentResource() != null && getCurrentResource().getFilename() != null) { System.out.println("update:" + getCurrentResource().getFilename()); } } } 

E il mio lettore:

    

Il codice precedente legge correttamente i file XML ma il metodo getCurrentResources() restituisce null. Con il debug, il batch entra per aggiornare il metodo

Per favore aiuto!

Esiste un’interfaccia specifica per questo problema chiamata ResourceAware : è puramente necessario iniettare la risorsa corrente in oggetti letti da MultiResourceItemReader .
Controlla questa discussione per ulteriori informazioni.

Ho provato con un semplice Listener per registrare la risorsa corrente da un {@link MultiResourceItemReader} iniettato. Salva il valore in StepExecutionContext.

Per farlo funzionare con MultiResourceItemReader con accesso ai passaggi, accedo direttamente al proxy, vedi http://forum.springsource.org/showthread.php?120775-Accessazione-il-attualmente-processo-nomefile , https: //gist.github. it / 1582202 e https://jira.springsource.org/browse/BATCH-1831 .

 public class GetCurrentResourceChunkListener implements ChunkListener, StepExecutionListener { private StepExecution stepExecution; private Object proxy; private final List fileNames = new ArrayList<>(); public void setProxy(Object mrir) { this.proxy = mrir; } @Override public void beforeStep(StepExecution stepExecution) { this.stepExecution = stepExecution; } @Override public ExitStatus afterStep(StepExecution stepExecution) { return stepExecution.getExitStatus(); } @Override public void beforeChunk(ChunkContext cc) { if (proxy instanceof Advised) { try { Advised advised = (Advised) proxy; Object obj = advised.getTargetSource().getTarget(); MultiResourceItemReader mrirTarget = (MultiResourceItemReader) obj; if (mrirTarget != null && mrirTarget.getCurrentResource() != null && !fileNames.contains(mrirTarget.getCurrentResource().getFilename())) { String fileName = mrirTarget.getCurrentResource().getFilename(); fileNames.add(fileName); String index = String.valueOf(fileNames.indexOf(fileName)); stepExecution.getExecutionContext().put("current.resource" + index, fileName); } } catch (Exception ex) { throw new RuntimeException(ex); } } } @Override public void afterChunk(ChunkContext cc) { } @Override public void afterChunkError(ChunkContext cc) { } } 

vedi https://github.com/langmi/spring-batch-examples-playground per un esempio funzionante – cerca “GetCurrentResource …”