2017-02-22 10 views
1

Я новичок в Spring Batch, и я начал использовать Spring Boot & Spring Batch official tutorial.Spring Batch: перейдите по именам файлов для чтения на следующий шаг

Проблема заключается в том, что после чтения в некоторых файлах с использованием весеннего пакета я хочу сохранить имена этих файлов и удалить их на следующем шаге.

Сначала я попробовал StepExecutionContext для передачи данных, но, судя по всему, данные, которые я хотел передать, были дорогими. Поэтому я попытался сохранить имя файлов, которые я прочитал, когда инициализировал свой Reader и читал этот файл на следующем шаге.

@Bean 
public MultiResourceItemReader<Widget> widgetMultiReader() { 
    MultiResourceItemReader<Widget> reader = new MultiResourceItemReader<Widget>(); 
    ClassLoader cl = this.getClass().getClassLoader(); 
    ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(cl); 
    try { 
     System.out.println("file:" + dataFileLocation + "Widget*.dat"); 
     Resource[] resources = resolver.getResources("file:" + dataFileLocation + "Widget*.dat"); 
     System.out.println("FOUND " + resources.length + " Widget.dat files"); 
     StringBuilder sb = new StringBuilder(); 
     for (int i=0; i<resources.length; i++) { 
      System.out.println(resources[i].getFilename()); 
      sb.append(resources[i].getFilename()); 
      if(i < resources.length-1){ 
       sb.append("\n"); 
      } 
     } 
     reader.setResources(resources); 
     reader.setDelegate(widgetReader()); 

     File tempFolder = new File(dataFileLocation + Constants.TEMP_FOLDER_NAME); 
     tempFolder.mkdir(); 
     File tempFile = new File(tempFolder.getAbsolutePath(), "read_in_files.tmp"); 
     tempFile.createNewFile(); 
     FileWriter fileWriter = new FileWriter(tempFile, false); 
     fileWriter.write(sb.toString()); 
     fileWriter.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return reader; 
} 

Это все работает очень хорошо, но получается, если я сделаю это, то код внутри компонента будет выполняться автоматически, даже если он не определен в шаге задания. Это, по-видимому, связано с инъекцией зависимостей (Spring boot spring.batch.job.enabled=false not able to recognize)

Так что я должен снова изменить свой метод, если вы, ребята, поможете мне здесь, пожалуйста?

Все, что я хочу сделать, это прочитать в наборе текстовых файлов, прочитать в нем данные, сохранить их в базе данных (это уже сделано). Затем удалите/архивируйте/перемещайте эти файлы на следующем шаге поэтому, если есть что-то вроде FlatFileParseException, вся работа остановится и не удалит файлы.

+0

Пожалуйста, проверьте здесь http://stackoverflow.com/questions/23323535/spring-batch-delete-the-flatfile-from-directory-after-processed –

+0

К сожалению, это одна из многих, которые я проверил, но я не может даже реализовать этот код, и даже если бы я это сделал, tbh Мне не нравится удалять файлы по методу чтения, но скорее сделайте это как отдельный шаг с помощью таска. – dK3

+0

Если это так, в read() не удаляйте файл, а храните имя файла в контексте выполнения, продвигайте это свойство на следующий шаг и выполните удаление файлов –

ответ

0

Создать сервис, который можно использовать для передачи данных между этапами

По аннотированию службы с @JobScope или @StepScope он будет жить только в течение этого этапа или работы.

import org.springframework.batch.core.configuration.annotation.JobScope; 
import org.springframework.stereotype.Service; 

import java.io.File; 
import java.util.List; 

@Service 
@JobScope 
public class FilesService { 

    private List<File> files; 

    public List<File> getFiles() { 
     return files; 
    } 

    public void setFiles(List<File> files) { 
     this.files = files; 
    } 
} 
Смежные вопросы