代码之家  ›  专栏  ›  技术社区  ›  Josh

Spring批处理平面文件头

  •  0
  • Josh  · 技术社区  · 7 年前

    我有个头像是这样的:

    // Writer
        @Bean(name = "cms200Writer")
        @StepScope
        public FlatFileItemWriter<Cms200Item> cmsWriter(@Value("#{jobExecutionContext}") Map<Object, Object> ec, //
                @Qualifier("cms200LineAggregator") FormatterLineAggregator<Cms200Item> lineAgg) throws IOException {
            @SuppressWarnings("unchecked")
            String fileName = ((Map<String, MccFtpFile>) ec.get(AbstractSetupTasklet.BATCH_FTP_FILES)).get("cms").getLocalFile();
            //Ensure the file can exist.
            PrintWriter fos = getIoHarness().getFileOutputStream(fileName);
            fos.close();
            FlatFileItemWriter<Cms200Item> writer = new FlatFileItemWriter<>();
            writer.setResource(new FileSystemResource(fileName));
            writer.setLineAggregator(lineAgg);
            Calendar cal = Calendar.getInstance();
            Date date = cal.getTime();
            DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
            String formattedDate=dateFormat.format(date);
            writer.setHeaderCallback(new FlatFileHeaderCallback() {
                public void writeHeader(Writer writer) throws IOException  {
                    writer.write("                                            Test Company.                                                           " + formattedDate);
                    writer.write("\n  CMS200                  CUSTOMER SHIPMENT MANIFEST AUTHORIZATION BY CUSTOMER NAME                                        Page 1");
                    writer.write("\n\n");
                    writer.write("      CUSTOMER  NAME          CITY        ST  CONTROL  MNFST ID  AUTH CODE   I03  CLS  EDI  EXPRESS   POV     MOST CURRENT  DEACTIVE");
                    writer.write("\n");
                    writer.write("                                                NBR                               TRL  214   WORK                ACCESS       DATE  ");
                }
            });
            return writer;
        }
    

    每次处理53条记录时,我都要打印此标题。我不知道如何在我的Spring批处理工作中实现这个逻辑。我有 writeCount 添加到我的执行上下文中,但不确定如何访问它,或者这是否是正确的方法。

    我发布的writer在我的BatchConfiguration.java文件中

    编辑:

    下面是我的文件步骤和添加的块大小

    @Bean(name = "cms200FileStep")
        public Step createFileStep(StepBuilderFactory stepFactory, //
                @Qualifier("cms200Reader") ItemReader<Cms200Item> reader, //
                Cms200Processor processor, //
                @Qualifier("cms200Writer") ItemWriter<Cms200Item> writer) {
            return stepFactory.get("cms200FileStep") //
                    .<Cms200Item, Cms200Item>chunk(100000) //
                    .reader(reader) //
                    .processor(processor) //
                    .writer(writer).chunk(53) //
                    .allowStartIfComplete(true)//
                    .build();//
        }
    

    编辑:添加的作业配置

    // Job
        @Bean(name = "mccCMSCLRPTjob")
        public Job mccCmsclrptjob(JobBuilderFactory jobFactory, //
                @Qualifier("cms200SetupStep") Step setupStep, //
                @Qualifier("cms200FileStep") Step fileStep, //
                @Qualifier("putFtpFilesStep") Step putFtpStep, //
                @Qualifier("cms200TeardownStep") Step teardownStep, //
                @Autowired SingleInstanceListener listener,
                @Autowired ChunkSizeListener chunkListener) { //
            return jobFactory.get("mccCMSCLRPTjob") //
                    .incrementer(new RunIdIncrementer()) //
                    .listener(listener) //
                    .start(setupStep) //
                    .next(fileStep) //
                    .next(putFtpStep) //
                    .next(teardownStep) //
                    .build();
        }
    

    编辑: 添加侦听器

       @Bean(name = "cms200FileStep")
            public Step createFileStep(StepBuilderFactory stepFactory, //
                    @Qualifier("cms200Reader") ItemReader<Cms200Item> reader, //
                    Cms200Processor processor, //
                    @Qualifier("cms200Writer") ItemWriter<Cms200Item> writer,
                    @Autowired ChunkSizeListener listener) {
                return stepFactory.get("cms200FileStep") //
                        .<Cms200Item, Cms200Item>chunk(100000) //
                        .reader(reader) //
                        .processor(processor) //
                        .writer(writer).chunk(53) //
                        .allowStartIfComplete(true)//
                        .listener(listener) //
                        .build();//
            }
    

    编辑: 经过多次反复,这就是我现在所处的位置

        // Utility Methods
        @Bean(name = "cms200FileStep")
        public Step createFileStep(StepBuilderFactory stepFactory, Map<Object, Object> ec, //
                @Qualifier("cms200Reader") ItemReader<Cms200Item> reader, //
                Cms200Processor processor, //
                @Qualifier("cms200Writer") ItemWriter<Cms200Item> writer) throws IOException {
            @SuppressWarnings("unchecked")
            String fileName = ((Map<String, MccFtpFile>) ec.get(AbstractSetupTasklet.BATCH_FTP_FILES)).get("cms").getLocalFile();
            return stepFactory.get("cms200FileStep") //
                    .<Cms200Item, Cms200Item>chunk(100000) //
                    .reader(reader) //
                    .processor(processor) //
                    .writer(writer).chunk(53) //
                    .allowStartIfComplete(true)//
    //                .listener((ChunkListener) listener) //
                    .listener((ChunkListener) new ChunkSizeListener(new File(fileName))) //
                    .build();//
        }
    
    0 回复  |  直到 7 年前
        1
  •  0
  •   Mahmoud Ben Hassine    7 年前

    这个 FlatFileHeaderCallback 只在面向块的步骤之前调用一次,也就是在所有块之前调用。

    每次处理53条记录时,我都要打印此标题

    您可以将块大小设置为53并使用 ChunkListener ItemWriteListener 写入所需的数据。

    编辑:添加示例

    class MyChunkListener extends StepListenerSupport {
    
        private FileWriter fileWriter;
    
        public MyChunkListener(File file) throws IOException {
            this.fileWriter = new FileWriter(file, true);
        }
    
        @Override
        public void beforeChunk(ChunkContext context) {
            try {
                fileWriter.write("your custom header");
                fileWriter.flush();
            } catch (IOException e) {
                System.err.println("Unable to write header to file");
            }
        }
    
        @Override
        public ExitStatus afterStep(StepExecution stepExecution) {
            try {
                fileWriter.close();
            } catch (IOException e) {
                System.err.println("Unable to close writer");
            }
            return super.afterStep(stepExecution);
        }
    }