Spring BatchのSample(複合形式ファイルの読み取り、マルチファイルの書き込み)(七)
11410 ワード
回転:http://www.cnblogs.com/gulvzhe/archive/2011/12/18/2291570.html
先のSpring Batchについては、CSVファイルに対するSpringBatchの読み書き操作、XMLファイルに対する操作、固定長形式ファイルに対する操作について説明します.これらの事例では,同じReaderが同じ形式のデータを読み出し,最終的に1つのファイルに書き込む.次のようなデータに遭遇し、学生情報と商品情報を分類して2つのファイルに書き込もうとした場合、どうすればいいのでしょうか.
student,200001,ZhangSan,18,78goodsPNH001011000200.1zhangshana2011/12/18 01:12:36student,200002,LiSi,19,79goodsPNH001022000300.1zhangshanb2011/12/19 01:12:36student,200003,WangWu,20,80goodsPNH001033000400.1zhangshanc2011/12/20 01:12:36
* studentで始まるデータは学生情報、goodsで始まる商品情報を表します
今回は、Spring Batchが複合形式のデータを読み込み、異なるファイルを書き込む方法について検討します.
工事構造は下図の通り:
ApplicationContext.xmlとlog 4 j.xmlは前文で述べたが,ここでは後述しない.
この例のコアプロファイルbatch.mxlの内容は次のとおりです.
36-57行にはReaderの基本情報が構成されています.FlatFileItemReaderのlineMapperプロパティSpringBatchコアクラスT h t ernMatchingCompositeLineMapperを使用すると、読み込んだレコードが異なる方法で私たちのPojoオブジェクトにマッピングされます.もちろん、まず、異なるtokenizers(43-48)とfieldSetMapers(49-54)を構成し、現在の記録をその原則に従って解析し、マッピングするように伝えます.45行に示すように、keyをstudent*と指定する場合、studentTokenizerでfieldsetに解析し、studentFieldSetMapperでstudentTokenizerで解析したfieldsetレコードをStudentオブジェクトにマッピングします.私たちが指定したkeyは、実はstudentの先頭の記録で、*はワイルドカードです.PatternMatchingCompositeLineMapperでは、*と?の2つのワイルドカードがサポートされています.前者は複数の文字を表し、後者は1文字のみを表す.studentとgoods情報がpojoオブジェクトにどのようにマッピングされるかについては,前述の文章で詳細に紹介したが,ここでは後述しない.
96-104行にはWriterの基本情報が配置されています.Writerもエージェントを使用する方式で、学生情報は106-122行で定義されたstudentWriterを使用して固定長のフォーマットで学生情報ファイルに書き込まれ、商品情報は124-141行で定義されたgoodsWriterを使用してCSVのフォーマットで商品情報ファイルに書き込まれる.MultiItemWriterのコードは簡単で、詳しく説明しません.以下のとおりです
studentやgoodsクラスの情報は、前の文章と同じようにコードが貼られなくなります.
Jobが起動したコードは以下の通りです.
処理結果の学生情報ファイルは以下の図である.
処理結果の商品情報ファイルは以下の図である.
Spring Batchの複合フォーマットファイルの読み書き操作についてここで議論します.これでSpring Batchのファイルの簡単な操作についての議論も一段落し,次回はSpring Batchの読み書きDBの操作について議論する.
先のSpring Batchについては、CSVファイルに対するSpringBatchの読み書き操作、XMLファイルに対する操作、固定長形式ファイルに対する操作について説明します.これらの事例では,同じReaderが同じ形式のデータを読み出し,最終的に1つのファイルに書き込む.次のようなデータに遭遇し、学生情報と商品情報を分類して2つのファイルに書き込もうとした場合、どうすればいいのでしょうか.
student,200001,ZhangSan,18,78goodsPNH001011000200.1zhangshana2011/12/18 01:12:36student,200002,LiSi,19,79goodsPNH001022000300.1zhangshanb2011/12/19 01:12:36student,200003,WangWu,20,80goodsPNH001033000400.1zhangshanc2011/12/20 01:12:36
* studentで始まるデータは学生情報、goodsで始まる商品情報を表します
今回は、Spring Batchが複合形式のデータを読み込み、異なるファイルを書き込む方法について検討します.
工事構造は下図の通り:
ApplicationContext.xmlとlog 4 j.xmlは前文で述べたが,ここでは後述しない.
この例のコアプロファイルbatch.mxlの内容は次のとおりです.
student
ID
name
age
score
21-33行にはJobの基本情報が配置されている. 36-57行にはReaderの基本情報が構成されています.FlatFileItemReaderのlineMapperプロパティSpringBatchコアクラスT h t ernMatchingCompositeLineMapperを使用すると、読み込んだレコードが異なる方法で私たちのPojoオブジェクトにマッピングされます.もちろん、まず、異なるtokenizers(43-48)とfieldSetMapers(49-54)を構成し、現在の記録をその原則に従って解析し、マッピングするように伝えます.45行に示すように、keyをstudent*と指定する場合、studentTokenizerでfieldsetに解析し、studentFieldSetMapperでstudentTokenizerで解析したfieldsetレコードをStudentオブジェクトにマッピングします.私たちが指定したkeyは、実はstudentの先頭の記録で、*はワイルドカードです.PatternMatchingCompositeLineMapperでは、*と?の2つのワイルドカードがサポートされています.前者は複数の文字を表し、後者は1文字のみを表す.studentとgoods情報がpojoオブジェクトにどのようにマッピングされるかについては,前述の文章で詳細に紹介したが,ここでは後述しない.
96-104行にはWriterの基本情報が配置されています.Writerもエージェントを使用する方式で、学生情報は106-122行で定義されたstudentWriterを使用して固定長のフォーマットで学生情報ファイルに書き込まれ、商品情報は124-141行で定義されたgoodsWriterを使用してCSVのフォーマットで商品情報ファイルに書き込まれる.MultiItemWriterのコードは簡単で、詳しく説明しません.以下のとおりです
package com.wanggc.springbatch.sample.multitypessinglefile;
import java.util.ArrayList;
import java.util.List;
import org.springframework.batch.item.ItemWriter;
import com.wanggc.springbatch.sample.multitypessinglefile.pojo.Goods;
import com.wanggc.springbatch.sample.multitypessinglefile.pojo.Student;
/**
* 。
*
* @author Wanggc
*
* @param
*/
@SuppressWarnings("unchecked")
public class MultiItemWriter implements ItemWriter {
/** */
private List> delegates;
public void setDelegates(List> delegates) {
this.delegates = delegates;
}
@Override
public void write(List extends T> items) throws Exception {
// Writer
ItemWriter studentWriter = (ItemWriter) delegates.get(0);
// Writer
ItemWriter goodsWriter = (ItemWriter) delegates.get(1);
//
List studentList = new ArrayList();
//
List goodsList = new ArrayList();
// List
for (int i = 0; i < items.size(); i++) {
if ("Student".equals(items.get(i).getClass().getSimpleName())) {
studentList.add((Student) items.get(i));
} else {
goodsList.add((Goods) items.get(i));
}
}
// List ,
if (studentList.size() > 0) {
studentWriter.write(studentList);
}
// List ,
if (goodsList.size() > 0) {
goodsWriter.write(goodsList);
}
}
}
これで,複合ファイルの読み書き操作について議論は終了した.注意インスタンスはProcessorを構成していません.次はいくつかの補助ファイルの情報です.studentやgoodsクラスの情報は、前の文章と同じようにコードが貼られなくなります.
Jobが起動したコードは以下の通りです.
package com.wanggc.springbatch.sample.multitypessinglefile;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Launch {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"batch.xml");
JobLauncher launcher = (JobLauncher) context.getBean("jobLauncher");
Job job = (Job) context.getBean("multiTypeSingleFileJob");
try {
// JOB
JobExecution result = launcher.run(
job,
new JobParametersBuilder()
.addString("inputFilePath",
"C:\\testData\\multiTypesInput.txt")
.addString("outputFilePathStudent",
"C:\\testData\\student.txt")
.addString("outputFilePathGoods",
"C:\\testData\\goods.csv")
.toJobParameters());
//
System.out.println(result.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
Inputファイルの内容は以下の図である.処理結果の学生情報ファイルは以下の図である.
処理結果の商品情報ファイルは以下の図である.
Spring Batchの複合フォーマットファイルの読み書き操作についてここで議論します.これでSpring Batchのファイルの簡単な操作についての議論も一段落し,次回はSpring Batchの読み書きDBの操作について議論する.