Spring Batch - Độc giả, Nhà văn & Người xử lý

An Item Reader đọc dữ liệu vào ứng dụng hàng loạt mùa xuân từ một nguồn cụ thể, trong khi Item Writer ghi dữ liệu từ ứng dụng Spring Batch đến một điểm đến cụ thể.

An Item processorlà một lớp chứa mã xử lý xử lý dữ liệu được đọc vào lô mùa xuân. Nếu ứng dụng đọc n bản ghi thì mã trong bộ xử lý sẽ được thực thi trên mỗi bản ghi.

A chunk là một phần tử con của tasklet. Nó được sử dụng để thực hiện các thao tác đọc, ghi và xử lý. Chúng tôi có thể cấu hình trình đọc, trình ghi và bộ xử lý bằng cách sử dụng phần tử này, trong một bước như hình dưới đây.

<batch:job id = "helloWorldJob"> 
   <batch:step id = "step1"> 
      <batch:tasklet> 
         <batch:chunk reader = "cvsFileItemReader" writer = "xmlItemWriter" 
            processor = "itemProcessor" commit-interval = "10"> 
         </batch:chunk> 
      </batch:tasklet> 
   </batch:step> 
</batch:job>

Spring Batch cung cấp cho người đọc và người viết để đọc và ghi dữ liệu từ các hệ thống tệp / cơ sở dữ liệu khác nhau như MongoDB, Neo4j, MySQL, XML, flatfile, CSV, v.v.

Để bao gồm một trình đọc trong ứng dụng của bạn, bạn cần xác định một bean cho trình đọc đó, cung cấp các giá trị cho tất cả các thuộc tính bắt buộc trong bean và chuyển id của bean như một giá trị cho thuộc tính của phần tử chunk reader (giống với writer).

ItemReader

Nó là thực thể của một bước (của một quy trình hàng loạt) đọc dữ liệu. Một ItemReader đọc từng mục một. Spring Batch cung cấp một giao diệnItemReader. Tất cảreaders triển khai giao diện này.

Sau đây là một số lớp ItemReader được xác định trước do Spring Batch cung cấp để đọc từ nhiều nguồn khác nhau.

Người đọc Mục đích
FlatFIleItemReader Để đọc dữ liệu từ các tệp phẳng.
StaxEventItemReader Để đọc dữ liệu từ các tệp XML.
StoredProcedureItemReader Để đọc dữ liệu từ các thủ tục được lưu trữ của cơ sở dữ liệu.
JDBCPagingItemReader Để đọc dữ liệu từ cơ sở dữ liệu cơ sở dữ liệu quan hệ.
MongoItemReader Để đọc dữ liệu từ MongoDB.
Neo4jItemReader Để đọc dữ liệu từ Neo4jItemReader.

Chúng ta cần định cấu hình ItemReadersbằng cách tạo ra các hạt đậu. Sau đây là một ví dụ vềStaxEventItemReader mà đọc dữ liệu từ một tệp XML.

<bean id = "mysqlItemWriter" 
   class = "org.springframework.batch.item.xml.StaxEventItemWriter"> 
   <property name = "resource" value = "file:xml/outputs/userss.xml" /> 
   <property name = "marshaller" ref = "reportMarshaller" /> 
   <property name = "rootTagName" value = "Tutorial" /> 
</bean> 

<bean id = "reportMarshaller" 
   class = "org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
   <property name = "classesToBeBound"> 
      <list> 
         <value>Tutorial</value> 
      </list> 
   </property> 
</bean>

Theo quan sát, trong khi cấu hình, chúng ta cần chỉ định tên lớp tương ứng của trình đọc được yêu cầu và chúng ta cần cung cấp giá trị cho tất cả các thuộc tính được yêu cầu.

ItemWriter

Nó là yếu tố của stepcủa một quy trình hàng loạt ghi dữ liệu. Một ItemWriter viết một mục một lần. Spring Batch cung cấp một giao diệnItemWriter. Tất cả các nhà văn thực hiện giao diện này.

Sau đây là một số lớp ItemWriter được xác định trước do Spring Batch cung cấp để đọc từ nhiều nguồn khác nhau.

nhà văn Mục đích
FlatFIleItemWriter Để ghi dữ liệu vào các tệp phẳng.
StaxEventItemWriter Để ghi dữ liệu vào tệp XML.
StoredProcedureItemWriter Để ghi dữ liệu vào các thủ tục được lưu trữ của cơ sở dữ liệu.
JDBCPagingItemWriter Để ghi dữ liệu vào cơ sở dữ liệu cơ sở dữ liệu quan hệ.
MongoItemWriter Để ghi dữ liệu vào MongoDB.
Neo4jItemWriter Để ghi dữ liệu vào Neo4j.

Theo cách tương tự, chúng ta cần cấu hình ItemWriters bằng cách tạo các bean. Sau đây là một ví dụ vềJdbcCursorItemReader ghi dữ liệu vào cơ sở dữ liệu MySQL.

<bean id = "dbItemReader"
   class = "org.springframework.batch.item.database.JdbcCursorItemReader" scope = "step">
   <property name = "dataSource" ref = "dataSource" />
   <property name = "sql" value = "select * from tutorialsdata" />
   <property name = "rowMapper">
      <bean class = "TutorialRowMapper" /> 
   </property>
</bean>

Bộ xử lý mặt hàng

ItemProcessor: Một ItemProcessor được sử dụng để xử lý dữ liệu. Khi mặt hàng đã cho không hợp lệ, nó sẽ trả lạinull, nếu không nó sẽ xử lý mục đã cho và trả về kết quả đã xử lý. Giao diệnItemProcessor<I,O> đại diện cho bộ xử lý.

Tasklet class - Khi không readerwriterđược đưa ra, một Tasklet hoạt động như một bộ xử lý cho SpringBatch. Nó chỉ xử lý một nhiệm vụ duy nhất.

Chúng tôi có thể xác định một bộ xử lý mục tùy chỉnh bằng cách triển khai giao diện ItemProcessor của gói org.springframework.batch.item.ItemProcessor. Lớp ItemProcessor này chấp nhận một đối tượng và xử lý dữ liệu và trả về dữ liệu đã xử lý như một đối tượng khác.

Trong một quy trình hàng loạt, nếu "n"các bản ghi hoặc các phần tử dữ liệu được đọc, sau đó đối với mỗi bản ghi, nó sẽ đọc dữ liệu, xử lý và ghi dữ liệu vào bộ ghi. Để xử lý dữ liệu, nó chuyển tiếp trên bộ xử lý được thông qua.

Ví dụ: giả sử bạn đã viết mã để tải một tài liệu PDF cụ thể, tạo một trang mới, ghi mục dữ liệu vào PDF ở định dạng bảng. Nếu bạn thực thi ứng dụng này, nó sẽ đọc tất cả các mục dữ liệu từ tài liệu XML, lưu trữ chúng trong cơ sở dữ liệu MySQL và in chúng trong tài liệu PDF nhất định trong các trang riêng lẻ.

Thí dụ

Sau đây là một lớp ItemProcessor mẫu.

import org.springframework.batch.item.ItemProcessor;  

public class CustomItemProcessor implements ItemProcessor<Tutorial, Tutorial> {  
   
   @Override 
   public Tutorial process(Tutorial item) throws Exception {  
      System.out.println("Processing..." + item); 
      return item; 
   } 
}