2015-10-22 1 views
5

Я получаю файл csv как вызов веб-службы, который должен быть закодирован. Сейчас я сохраняю его в каталоге temp, чтобы предоставить его как setResource для Reader.Чтение из потоков, а не файлов в весенний пакет itemReader

Есть ли способ предоставить поток (byte []) вместо того, чтобы сначала сохранить файл?

ответ

5

Метод setResourceItemReader принимает параметр org.springframework.core.io.Resource в качестве параметра. Этот класс имеет несколько готовых реализаций, среди которых вы можете найти org.springframework.core.io.InputStreamResource. Конструктор этого класса принимает java.io.InputStream, который может быть реализован java.io.ByteArrayInputStream.

Технически, да, вы можете использовать параметр byte[] в ItemReader.

Теперь о том, как на самом деле сделать это, вот несколько идей:

1) Создайте свой собственный FlatFileItemReader (с CSV плоский файл) и сделать его реализации StepExecutionListener

public class CustomFlatFileItemReader<T> extends FlatFileItemReader<T> implements StepExecutionListener { 
} 

2) Перекрыть метод beforeStep, делать WebService вызова внутри и сохранить результат в переменной

private byte[] stream; 

@Override 
public void beforeStep(StepExecution stepExecution) { 

    // your webservice logic 
    stream = yourWebservice.results(); 

} 

3) Переопределение setResource способ передать это stream в качестве фактического ресурса.

@Override 
public void setResource(Resource resource) { 

    // Convert byte array to input stream 
    InputStream is = new ByteArrayInputStream(stream); 

    // Create springbatch input stream resource 
    InputStreamResource res = new InputStreamResource(is); 

    // Set resource 
    super.setResource(res); 
} 

Кроме того, если вы не хотите, чтобы вызвать ваш веб-сервиса в пределах ItemReader, вы можете просто хранить массив байтов в JobExecutionContext и получить его в методе beforeStep с stepExecution.getJobExecution().getExecutionContext().get("key");

+0

отличным ответом на точка. Спасибо @Thrax – explorer

+0

Есть ли способ передать поток при запуске задания через работу Launcher, что-то похожее на передачу jobParameters? У меня есть отдельная служба для получения файла, а затем я хочу запустить пакетное задание для его загрузки. – explorer

+0

@explorer К сожалению, 'JobParameters' может передавать только' String', 'Long',' Date' и 'Double'. Согласно этому сообщению: http://forum.spring.io/forum/spring-projects/batch/96660-how-to-pass-complex-objects-to-job-launcher, вам нужно либо использовать внешнее хранилище (save ваш файл) или объявить компонент, который может обеспечить доступ к нему. – Thrax

Смежные вопросы