2014-10-30 15 views
5

Trên documentation của Spring Batch để định cấu hình một bước, một bức tranh rõ ràng mô tả cách thức đọc và ghi được thực hiện.Tài liệu Batch Spring về bước chunk theo định hướng so với thực tế?

read 
process 
... 
read 
process 
// until #amountOfReadsAndProcesses = commit interval 
write 

tương ứng (theo doc):

List items = new Arraylist(); 
for(int i = 0; i < commitInterval; i++){ 
    Object item = itemReader.read() 
    Object processedItem = itemProcessor.process(item); 
    items.add(processedItem); 
} 
itemWriter.write(items); 

Tuy nhiên khi tôi gỡ lỗi và đặt một breakpoint trong phương pháp đọc của người đọc và một breakpoint trong phương pháp xử lý của bộ xử lý tôi thấy hành vi sau:

read 
... 
read 
// until #amountOfReads = commit interval 
process 
... 
process 
// until #amountOfProcesses = commit interval 
write 

Vì vậy, tài liệu đó có sai không? Hoặc tôi thiếu một số cấu hình để làm cho nó hoạt động như tài liệu (không tìm thấy bất cứ điều gì ở đó).

Vấn đề mà tôi có là mỗi lần đọc consequetive bây giờ phụ thuộc vào trạng thái từ bộ xử lý. Người đọc là một tổng hợp đọc hai nguồn song song, tùy thuộc vào một mục được đọc ở một trong các nguồn chỉ có nguồn đầu tiên, thứ hai hoặc cả hai được đọc trong một thao tác đọc. Nhưng trạng thái của các nguồn cần đọc được thực hiện trong bộ xử lý. Hiện tại, giải pháp duy nhất là dành cho khoảng thời gian cam kết 1, không phải là rất tối ưu cho hiệu suất.

+0

bạn có thể dùng thử với Trình đọc tùy chỉnh bao gồm trình đọc chuẩn và logic tùy chỉnh –

+0

Có Tôi đã nghĩ về điều đó nhưng không phù hợp với mô hình của lô. Người đọc không chịu trách nhiệm tạo ra đầu ra. – Juru

+0

Tôi sẽ thử nó với các bảng cơ sở dữ liệu cho các nguồn (nhập với lô đầu tiên) và đọc dữ liệu với một SQL thích hợp (lô thứ hai để xử lý nghiệp vụ) –

Trả lời

3

Câu trả lời ngắn gọn là, bạn đúng, tài liệu của chúng tôi không chính xác về mô hình chunking. Đó là điều cần được cập nhật. Có những lý do tại sao nó là cách nó (họ chủ yếu là phải làm gì với cách xử lý lỗi khoan dung được xử lý). Nhưng điều đó không giải quyết được vấn đề của bạn. Đối với trường hợp sử dụng của bạn, có một vài tùy chọn:

  • Định cấu hình công việc của bạn bằng cấu hình JSR-352 - Mô hình xử lý cho JSR-352 là tài liệu của chúng tôi cho biết thực sự không). Vì Spring Batch hỗ trợ JSR-352, chỉ cần thay đổi cấu hình của bạn và cách bạn khởi động công việc của mình, bạn sẽ nhận được kết quả tương tự. Có những hạn chế của JSR-352 nằm ngoài phạm vi của cuộc thảo luận này nhưng đó là một tùy chọn.
  • Một tùy chọn khác là làm những gì Michael Pralow gợi ý - Trong khi tôi hiểu những lo ngại của bạn về việc phân tách các mối quan tâm, có vẻ như bạn đã vi phạm quy tắc đó cho rằng bộ xử lý của bạn đang tạo ra đầu ra mà người đọc cần (hoặc là bạn chia sẻ trạng thái đó theo cách khác?).
  • Các tùy chọn khác - Không biết nhiều hơn về công việc của bạn, có thể có các cách khác để cấu trúc công việc của bạn hoạt động tốt (những thứ như chuyển logic thành nhiều bước, v.v) và vẫn đạt được sự phân tách các mối quan tâm mà Spring Batch cố gắng cho phép nhưng tôi cần xem thêm cấu hình của bạn để có thể trợ giúp ở đó.
+0

Đối với tùy chọn hai. Có một trạng thái bên trong ngữ cảnh thực hiện của bước. Nó không phải là đầu ra của bộ xử lý được sử dụng. – Juru

+0

Tôi làm cách nào để chia sẻ cấu hình công việc của bạn? Nó không thực sự liên quan đến vấn đề này. – Juru

+0

Tạo chủ đề mới hỏi cách xử lý quản lý trạng thái giữa bộ xử lý và trình đọc trong Spring Batch. –

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