2015-10-22 15 views

Trả lời

5

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");

+0

câu trả lời xuất sắc, đến điểm. Cảm ơn bạn @Thrax – explorer

+0

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

+0

@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

Các vấn đề liên quan