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の内容は次のとおりです.



    
    
    
        
            
                
                    
                        
                        
                    
                
            
        
    

    
    
        
        
            
                
                    
                        
                        
                    
                
                
                    
                        
                        
                    
                
            
        
    
    
        
        
            
                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の操作について議論する.