map.size()不使用静态地图

时间:2014-05-16 17:52:21

标签: java spring-batch

嘿,我正试图从其他类中获取静态地图的大小...

我在一个班级中定义静态地图......如

tasklet.class

  package com.hcsc.ccsp.nonadj.subrogation.integration;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;

import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.io.Resource;
import org.springframework.util.Assert;

import com.hcsc.ccsp.nonadj.subrogation.batch.Subrogation;

import com.hcsc.ccsp.nonadj.subrogation.common.SubrogationConstants;

/**
 * @author Manan Shah
 * 
 */

public class SubrogationFileTransferTasklet implements Tasklet,
        InitializingBean {
    private Logger logger = LogManager
            .getLogger(SubrogationFileTransferTasklet.class);
    private Resource inputfile;
    private Resource outputfile;
    public static String fileLastName;

    public static String header = null;
    public static String trailer = null;
    public static List<Subrogation> fileDataListSubro = new ArrayList<Subrogation>();
    public List<String> fileDataListS = new ArrayList<String>();
    public static TreeMap<String, Subrogation> map = new TreeMap<String, Subrogation>();
    public int counter = 0;
    public String value;

    @Override
    public void afterPropertiesSet() throws Exception {
        Assert.notNull(inputfile, "inputfile must be set");

    }

    public void setTrailer(String trailer) {
        this.trailer = trailer;
    }

    public void setHeader(String header) {
        this.header = header;
    }

    public String getTrailer() {
        return trailer;
    }

    public String getHeader() {
        return header;
    }

    public Resource getInputfile() {
        return inputfile;
    }

    public void setInputfile(Resource inputfile) {
        this.inputfile = inputfile;
    }

    public Resource getOutputfile() {
        return outputfile;
    }

    public void setOutputfile(Resource outputfile) {
        this.outputfile = outputfile;
    }

    public static void setFileDataListSubro(List<Subrogation> fileDataListSubro) {
        SubrogationFileTransferTasklet.fileDataListSubro = fileDataListSubro;
    }

    public static List<Subrogation> getFileDataListSubro() {
        return fileDataListSubro;
    }

    public static void setMap(TreeMap<String, Subrogation> map) {
        SubrogationFileTransferTasklet.map = map;
    }

    public static TreeMap<String, Subrogation> getMap() {
        return map;
    }

    @Override
    public RepeatStatus execute(StepContribution contribution,
            ChunkContext chunkContext) throws Exception {

        value = (String) chunkContext.getStepContext().getStepExecution()
                .getJobExecution().getExecutionContext().get("outputFile");

        readFromFile();

        return RepeatStatus.FINISHED;
    }

    public void readFromFile() {
        BufferedReader br = null;

        try {

            String sCurrentLine;

            br = new BufferedReader(new FileReader(inputfile.getFile()));
            fileLastName = inputfile.getFile().getName();
            while ((sCurrentLine = br.readLine()) != null) {

                if (sCurrentLine.indexOf("TRAILER") != -1) {
                    setTrailer(sCurrentLine);
                } else if (sCurrentLine.indexOf("HEADER") != -1) {
                    setHeader(sCurrentLine);
                } else if (sCurrentLine.equalsIgnoreCase("")) {

                } else {
                    fileDataListS.add(sCurrentLine);
                }

            }

            convertListOfStringToListOfSubrogaion(fileDataListS);
            writeDataToFile();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null)
                    br.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

    }

    public void convertListOfStringToListOfSubrogaion(List<String> list) {

        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            Subrogation subrogration = new Subrogation();
            String s = iterator.next();
            subrogration.setGRP_NBR(StringUtils.substring(s, 0, 6));
            subrogration.setSECT_NBR(StringUtils.substring(s, 6, 10));
            subrogration.setAFP_VAL(StringUtils.substring(s, 10, 13));
            subrogration.setDOL_MIN_VAL(StringUtils.substring(s, 13, 20));
            subrogration
                    .setCORP_ENT_CD(StringUtils.substring(s, 20, s.length()));

            map.put(subrogration.getGRP_NBR() + subrogration.getSECT_NBR(),
                    subrogration);
            fileDataListSubro.add(subrogration);

        }

    }

    public void writeDataToFile() {
        try {

            File file = new File(value);

            if (!file.exists()) {

                logger.info("output file is:-" + file.getAbsolutePath());

                file.createNewFile();

            }

            FileWriter fw = new FileWriter(file.getAbsoluteFile());

            BufferedWriter bw = new BufferedWriter(fw);

            Iterator it = map.entrySet().iterator();
            while (it.hasNext()) {
                Map.Entry subrogation = (Map.Entry) it.next();
                // System.out.println(subrogation.getKey() + " = " +
                // subrogation.getValue());
                // it.remove(); // avoids a ConcurrentModificationException

                bw.append(subrogation.getValue().toString()
                        + SubrogationConstants.filler58);

            }
            bw.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
        logger.info("subrogationFileTransferTasklet Step completes");

    }
}

在处理器中我想将地图大小放入int。

processor.class

   package com.hcsc.ccsp.nonadj.subrogation.processor;



import org.apache.commons.lang3.StringUtils;
import org.springframework.batch.item.ItemProcessor;

import com.hcsc.ccsp.nonadj.subrogation.Utils.SubrogationUtils;
import com.hcsc.ccsp.nonadj.subrogation.batch.Subrogation;
import com.hcsc.ccsp.nonadj.subrogation.common.SubrogationConstants;
import com.hcsc.ccsp.nonadj.subrogation.integration.SubrogationFileTransferTasklet;

public class SubrogationProcessor implements
        ItemProcessor<Subrogation, Subrogation> {



    public SubrogationFileTransferTasklet fileTransferTasklet = new SubrogationFileTransferTasklet();

    SubrogationUtils subrogationUtils = new SubrogationUtils();

    public int countFromFile=SubrogationFileTransferTasklet.map.size();

    public static int totalRecords = 0;

    public static int duplicate = 0;

    @Override
    public Subrogation process(Subrogation subrogration) throws Exception {
        // TODO Auto-generated method stub


        if (subrogationUtils.validateData(subrogration)) {
            Subrogation newSubro = new Subrogation();

            newSubro.setGRP_NBR(StringUtils.leftPad(subrogration.getGRP_NBR()
                    .trim(), SubrogationConstants.length6, "0"));

            if (subrogration.getSECT_NBR().trim().length() < 5) {
                newSubro.setSECT_NBR(StringUtils.leftPad(subrogration
                        .getSECT_NBR().trim(), SubrogationConstants.length4,
                        "0"));

            } else if (subrogration.getSECT_NBR().trim().length() == 5) {
                newSubro.setSECT_NBR(StringUtils.substring(subrogration.getSECT_NBR().trim(), 1));

            } else {
                return null;
            }

            newSubro.setAFP_VAL(StringUtils.leftPad(subrogration.getAFP_VAL()
                    .trim(), SubrogationConstants.length3, "0"));

            if (subrogration.getDOL_MIN_VAL().trim().contains(".")) {

                newSubro.setDOL_MIN_VAL(StringUtils.leftPad(StringUtils.substring(subrogration.getDOL_MIN_VAL(),0,subrogration.getDOL_MIN_VAL().indexOf(".")), SubrogationConstants.length7,
                        "0"));
            } else {
                newSubro.setDOL_MIN_VAL(StringUtils.leftPad(subrogration
                        .getDOL_MIN_VAL().trim(), SubrogationConstants.length7,
                        "0"));
            }

            newSubro.setCORP_ENT_CD(StringUtils.substring(
                    subrogration.getCORP_ENT_CD(), 0, 2));

            if (SubrogationFileTransferTasklet.map.containsKey(newSubro
                    .getGRP_NBR() + newSubro.getSECT_NBR())) {


                duplicate++;

                return null;
            } else {
                    if(SubrogationFileTransferTasklet.fileLastName.contains("TX")){
                        if(newSubro.getCORP_ENT_CD().equalsIgnoreCase("TX")){

                            SubrogationFileTransferTasklet.map.put(newSubro
                                    .getGRP_NBR() + newSubro.getSECT_NBR(), newSubro);
                        totalRecords++;
                        return newSubro;
                        }
                    }

                    else{
                        if(SubrogationFileTransferTasklet.fileLastName.contains("IL")){
                            if(!newSubro.getCORP_ENT_CD().equalsIgnoreCase("TX"))
                            {
                            newSubro.setCORP_ENT_CD("IL");
                            SubrogationFileTransferTasklet.map.put(newSubro
                                    .getGRP_NBR() + newSubro.getSECT_NBR(), newSubro);
                            totalRecords++;
                            return newSubro;
                            }
                        }
                        else{
                            return null;
                        }

                    }

                    return null;

            }

        }

        else {

            return null;
        }

    }


}

class SubrogrationException extends RuntimeException {

    private static final long serialVersionUID = -8971030257905108630L;

    public SubrogrationException(String message) {
        super(message);
    }
}

最后我想在其他类中使用countFromFile ..

writer.class

  package com.hcsc.ccsp.nonadj.subrogation.writer;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.Writer;
import java.util.Date;
import java.util.List;


import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

import org.springframework.batch.item.ItemStreamException;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.file.FlatFileFooterCallback;
import org.springframework.batch.item.file.FlatFileHeaderCallback;

import com.hcsc.ccsp.nonadj.subrogation.Utils.SubrogationUtils;
import com.hcsc.ccsp.nonadj.subrogation.batch.Subrogation;
import com.hcsc.ccsp.nonadj.subrogation.common.SubrogationConstants;
import com.hcsc.ccsp.nonadj.subrogation.integration.SubrogationFileTransferTasklet;
import com.hcsc.ccsp.nonadj.subrogation.processor.SubrogationProcessor;

public class SubrogationHeaderFooterWriter implements FlatFileFooterCallback,FlatFileHeaderCallback{


    private Logger logger = LogManager
    .getLogger(SubrogationHeaderFooterWriter.class);

    SubrogationFileTransferTasklet fileTransferTasklet = new SubrogationFileTransferTasklet();

    SubrogationUtils subrogationUtils=new SubrogationUtils();

    SubrogationProcessor processor=new SubrogationProcessor();

    private ItemWriter<Subrogation> delegate;



    public void setDelegate(ItemWriter<Subrogation> delegate) {
        this.delegate = delegate;
    }

    public ItemWriter<Subrogation> getDelegate() {
        return delegate;
    }




    @Override
    public void writeHeader(Writer writer) throws IOException {

        //writer.write(SubrogationFileTransferTasklet.header);

    }

    @Override
    public void writeFooter(Writer writer) throws IOException {


        String trailer = SubrogationFileTransferTasklet.trailer;
        String s1 = StringUtils.substring(trailer, 0, 23);

        logger.info(" Data from input file size is---- "+new SubrogationProcessor().countFromFile);
        int trailerCounter=new SubrogationProcessor().countFromFile+SubrogationProcessor.totalRecords;
        logger.info(" Data comming from database is"+SubrogationProcessor.totalRecords);

        logger.info(" Duplicate data From DataBase is " +SubrogationProcessor.duplicate);

        logger.info(" Traileer is " + s1+ trailerCounter);

        writer.write(s1 + trailerCounter);


        SubrogationFileTransferTasklet.map.clear();
        SubrogationFileTransferTasklet.fileDataListSubro.clear();
        SubrogationProcessor.totalRecords=0;
        SubrogationProcessor.duplicate=0;

    }

    public void writeErrorDataToFile(List<String> errorDataList,String errorfile){
        File file;
        try {
            file = new File(errorfile);

            logger.info("error file is "+errorfile);   

                FileWriter fileWriter = new FileWriter(file,true);

                BufferedWriter bufferWritter = new BufferedWriter(fileWriter);

                for(String data:errorDataList){

                bufferWritter.write(new Date()+" "+data);

                bufferWritter.write(SubrogationConstants.LINE_SEPARATOR);
                }
                bufferWritter.close();
            }

        catch (IOException e) {

            throw new ItemStreamException("Could not convert resource to file: [" + errorfile + "]", e);
        }
    }
    /*
    public void write(List<? extends Subrogation> subrogation) throws Exception {
        System.out.println("inside writer");

        delegate.write(subrogation);

    }*/


}

所以这里记录器massage.size打印0 .... 我无法理解为什么???

2 个答案:

答案 0 :(得分:1)

以这种方式确保在构造对象时使用当前的地图大小初始化它。

class SubrogationProcessor{

   public int countFromFile;

   public SubrogationProcessor(){
       countFromFile=SubrogationFileTransferTasklet.map.size();
   }
}

答案 1 :(得分:1)

这取决于运行“map.put”代码行的时间。它是在tasklet类的静态块中吗?

如果在将记录添加到地图之前初始化处理器实例,则map.size()确实为0。

我的建议是尽可能将映射添加到静态块中,或者调试代码并查看调用.size()方法时调用.put()方法的时间

public static TreeMap<String, Subrogation> map = new TreeMap<String, Subrogation>();

static{
    map.put(subrogration.getGRP_NBR() + subrogration.getSECT_NBR(), subrogration);
}