Метод setResource
ItemReader
принимает параметр 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");
отличным ответом на точка. Спасибо @Thrax – explorer
Есть ли способ передать поток при запуске задания через работу Launcher, что-то похожее на передачу jobParameters? У меня есть отдельная служба для получения файла, а затем я хочу запустить пакетное задание для его загрузки. – explorer
@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