Spring-batch-readers-writers-processors

提供:Dev Guides
移動先:案内検索

Spring Batch-リーダー、ライター、プロセッサー

  • アイテムリーダー*は特定のソースからスプリングバッチアプリケーションにデータを読み込み、*アイテムライター*はスプリングバッチアプリケーションから特定の宛先にデータを書き込みます。
  • アイテムプロセッサ*は、スプリングバッチに読み込まれたデータを処理する処理コードを含むクラスです。 アプリケーションがn個のレコードを読み取ると、プロセッサ内のコードが各レコードで実行されます。

チャンク*は *tasklet の子要素です。 読み取り、書き込み、および処理操作を実行するために使用されます。 以下に示すステップ内で、この要素を使用してリーダー、ライター、およびプロセッサーを構成できます。

<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は、MongoDB、Neo4j、MySQL、XML、フラットファイル、CSVなどのさまざまなファイルシステム/データベースからデータを読み書きするリーダーとライターを提供します。

アプリケーションにリーダーを含めるには、そのリーダーのBeanを定義し、Bean内のすべての必須プロパティに値を提供し、そのようなBeanの id をチャンク要素 readerの属性に値として渡す必要があります。 (*作家*と同じ)。

ItemReader

データを読み取るのは、(バッチプロセスの)ステップのエンティティです。 ItemReaderは、一度に1つのアイテムを読み取ります。 Spring Batchはインターフェース ItemReader を提供します。 すべての*リーダー*がこのインターフェースを実装しています。

以下は、さまざまなソースから読み取るために、Spring Batchが提供する定義済みのItemReaderクラスの一部です。

Reader Purpose
FlatFIleItemReader To read data from flat files.
StaxEventItemReader To read data from XML files.
StoredProcedureItemReader To read data from the stored procedures of a database.
JDBCPagingItemReader To read data from relational databases database.
MongoItemReader To read data from MongoDB.
Neo4jItemReader To read data from Neo4jItemReader.

Beanを作成して ItemReaders を構成する必要があります。 以下は、XMLファイルからデータを読み取る StaxEventItemReader の例です。

<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>

観察したように、構成中に、必要なリーダーのそれぞれのクラス名を指定する必要があり、すべての必要なプロパティに値を提供する必要があります。

ItemWriter

これは、データを書き込むバッチプロセスの step の要素です。 ItemWriterは、一度に1つのアイテムを書き込みます。 Spring Batchはインターフェース ItemWriter を提供します。 すべてのライターがこのインターフェイスを実装しています。

以下は、Spring Batchがさまざまなソースから読み取るために提供する事前定義済みItemWriterクラスの一部です。

Writer Purpose
FlatFIleItemWriter To write data into flat files.
StaxEventItemWriter To write data into XML files.
StoredProcedureItemWriter To write data into the stored procedures of a database.
JDBCPagingItemWriter To write data into relational databases database.
MongoItemWriter To write data into MongoDB.
Neo4jItemWriter To write data into Neo4j.

同様に、Beanを作成してItemWriterを構成する必要があります。 以下は、MySQLデータベースにデータを書き込む JdbcCursorItemReader の例です。

<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>

アイテムプロセッサー

*ItemProcessor* :ItemProcessorはデータの処理に使用されます。 指定されたアイテムが無効な場合は *null* を返し、そうでない場合は指定されたアイテムを処理して処理結果を返します。 インターフェイス *ItemProcessor <I、O>* はプロセッサを表します。
  • Taskletクラス*- reader および writer が指定されていない場合、TaskletはSpringBatchのプロセッサとして機能します。 単一のタスクのみを処理します。

パッケージ org.springframework.batch.item.ItemProcessor のインターフェイス ItemProcessor を実装することにより、カスタムアイテムプロセッサを定義できます。 このItemProcessorクラスはオブジェクトを受け入れ、データを処理し、処理されたデータを別のオブジェクトとして返します。

バッチプロセスでは、 "n" レコードまたはデータ要素が読み取られると、各レコードについて、データを読み取り、処理し、ライターにデータを書き込みます。 データを処理するには、渡されたプロセッサで中継します。

たとえば、特定のPDFドキュメントを読み込み、新しいページを作成し、データ形式を表形式でPDFに書き込むためのコードを記述したとします。 このアプリケーションを実行すると、XMLドキュメントからすべてのデータ項目が読み取られ、MySQLデータベースに保存され、個々のページの指定されたPDFドキュメントに印刷されます。

以下は、ItemProcessorクラスのサンプルです。

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;
   }
}