Phương pháp setResource
của số ItemReader
lấy một tham số org.springframework.core.io.Resource
. Lớp này có một vài triển khai ngoài hộp, trong đó bạn có thể tìm thấy org.springframework.core.io.InputStreamResource
. Nhà xây dựng của lớp này có một số java.io.InputStream
có thể được triển khai bởi java.io.ByteArrayInputStream
.
Vì vậy, về mặt kỹ thuật, bạn có thể sử dụng thông số byte[]
trong một ItemReader
.
Bây giờ, để làm thế nào để thực sự làm điều đó, dưới đây là một vài ý tưởng:
1) Tạo của riêng bạn FlatFileItemReader
(kể từ CSV là một tập tin phẳng) và làm cho nó thực hiện StepExecutionListener
public class CustomFlatFileItemReader<T> extends FlatFileItemReader<T> implements StepExecutionListener {
}
2) Override phương pháp beforeStep
, làm cuộc gọi webservice của bạn trong vòng và lưu kết quả trong một biến
private byte[] stream;
@Override
public void beforeStep(StepExecution stepExecution) {
// your webservice logic
stream = yourWebservice.results();
}
3) Ghi đèPhương phápđể chuyển số stream
này làm tài nguyên thực.
@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);
}
Ngoài ra, nếu bạn không muốn gọi webservice của bạn trong ItemReader, bạn có thể chỉ đơn giản là lưu trữ các mảng byte trong JobExecutionContext
và làm cho nó trong phương pháp beforeStep
với stepExecution.getJobExecution().getExecutionContext().get("key");
câu trả lời xuất sắc, đến điểm. Cảm ơn bạn @Thrax – explorer
Có cách nào để truyền một luồng trong khi khởi chạy công việc thông qua Trình khởi chạy công việc hay không, một cái gì đó tương tự như truyền công việcParameters? Tôi có một dịch vụ riêng để nhận tệp và sau đó tôi muốn bắt đầu công việc hàng loạt để tải nó. – explorer
@explorer Thật không may, 'JobParameters' chỉ có thể truyền các kiểu' String', 'Long',' Date' và 'Double'. Theo bài đăng này: http://forum.spring.io/forum/spring-projects/batch/96660-how-to-pass-complex-objects-to-job-launcher, bạn phải sử dụng bộ nhớ ngoài (lưu tệp của bạn) hoặc khai báo một bean có thể cung cấp quyền truy cập vào nó. – Thrax