Пакетное чтение файлов Spring по одному. Содержимое файла непостоянно - PullRequest
0 голосов
/ 05 августа 2020

MultiResourceItemReader читает все файлы последовательно.

Я хочу, чтобы как только один файл был полностью прочитан, он должен вызывать процессор / писатель. Он не должен читать следующий файл.

Поскольку содержимое файла не является постоянным, Я не могу go с размером блока.

Есть идеи относительно политики блоков, определяющей конец содержимого файла?

Ответы [ 2 ]

0 голосов
/ 17 августа 2020
Using MultiResourceItemReader, assigning multiple file reasources.
Using custom file reader as delegate, reading a file completely 
For reading file completely, come up with a logic


@Bean
    public MultiResourceItemReader<SimpleFileBean> simpleReader() 
    {
        Resource[]  resourceList  = getFileResources();
        
        if(resourceList == null) {
            System.out.println("No input files available");
        }
        
        MultiResourceItemReader<SimpleFileBean> resourceItemReader = new MultiResourceItemReader<SimpleFileBean>();
        resourceItemReader.setResources(resourceList);
        resourceItemReader.setDelegate(simpleFileReader());
        return resourceItemReader;
    }


    @Bean
    SimpleInboundReader simpleFileReader() {
        
        return new SimpleInboundReader(customSimpleFileReader());
    }

    @Bean 
    public FlatFileItemReader customSimpleFileReader() {    
    
        return new FlatFileItemReaderBuilder()            
                .name("customFileItemReader")            
                .lineMapper(new PassThroughLineMapper())            
                .build(); 
        }


    public class SimpleInboundReader implements ResourceAwareItemReaderItemStream{

    private Object currentItem = null;
    private FileModel fileModel = null;
    private String fileName = null;
    private boolean fileRead = false;
    
    
    
    private ResourceAwareItemReaderItemStream<String> delegate;
    
    public SimpleInboundReader(ResourceAwareItemReaderItemStream<String> delegate) {        
        this.delegate = delegate;
    }

    @Override
    public void open(ExecutionContext executionContext) throws ItemStreamException {

        delegate.open(executionContext);
    }

    @Override
    public void update(ExecutionContext executionContext) throws ItemStreamException {
        delegate.update(executionContext);
    }

    @Override
    public void close() throws ItemStreamException {
        delegate.close();
    }


    @Override
    public void setResource(Resource resource) {
        fileName = resource.getFilename();
        this.delegate.setResource(resource);
    }
    

    
    String getNextLine() throws UnexpectedInputException, ParseException, NonTransientResourceException, Exception {
        
        return delegate.read();
    }


        @Override
    public SimpleFileBean read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
        
        SimpleFileBean simpleFileBean = null;
    
        String currentLine = null;
        
        currentLine=delegate.read();
        
        if(currentLine != null) {
            
            simpleFileBean = new SimpleFileBean();
            simpleFileBean.getLines().add(currentLine);
            
            while ((currentLine  = getNextLine()) != null) {
                simpleFileBean.getLines().add(currentLine);
            }
            
            return simpleFileBean;
        }
      return null;
     }
  }
0 голосов
/ 06 августа 2020

Я думаю, вам следует написать шаг, который читает / обрабатывает / записывает только один файл с помощью «считывателя отдельных файлов» (например, FlatFileItemReader). И повторите этот шаг, пока есть файлы.

Пакет Spring дает вам возможность сделать это: условные потоки и в частности programmati c решение потока что дает вам разумный способ решить, когда останавливать al oop между шагами (когда файла больше нет)

И поскольку вы не сможете дать постоянное имя входного файла вашему читателю, Вам также следует взглянуть на Раздел позднего связывания .

Надеюсь, этого будет достаточно, чтобы вам помочь. Прокомментируйте, если вам нужны подробности.

...