Получить имена всех файлов, которые должны быть считаны в/выписал (через некоторый класс обслуживания) и сохранить их в контексте выполнения в реализация Partitioner.
public class filePartitioner implements Partitioner {
@Override
public Map<String, ExecutionContext> partition(int gridSize) {
Map<String, Path> filesToProcess = this.service.getFilesToProcess(directory); // this is just sudo-ish code but maybe you inject the directory you'll be targeting into this class
Map<String, ExecutionContext> execCtxs = new HashMap<>();
for(Entry<String, Path> entry : filesToProcess.entrySet()) {
ExecutionContext execCtx = new ExecutionContext();
execCtx.put("file", entry.getValue());
execCtxs.put(entry.getKey(), execCtx);
}
return execCtxs;
}
// injected
public void setServiceClass(ServiceClass service) {
this.service = service;
}
}
a. Для метода .getFilesToProcess() вам просто нужно что-то, что возвращает все файлы в указанном каталоге, потому что вам нужно знать, что должно быть прочитано, и имя файла, который должен быть записан. Очевидно, что существует несколько способов, чтобы идти об этом, таких как ...
public Map<String, Path> getFilesToProcess(String directory) {
Map<String, Path> filesToProcess = new HashMap<String, Path>();
File directoryFile = new File(directory); // where directory is where you intend to read from
this.generateFileList(filesToProcess, directoryFile, directory);
private void generateFileList(Map<String, Path> fileList, File node, String directory) {
// traverse directory and get files, adding to file list.
if(node.isFile()) {
String file = node.getAbsoluteFile().toString().substring(directory.length() + 1, node.toString().length());
fileList.put(file, directory);
}
if(node.isDirectory()) {
String[] files = node.list();
for(String filename : files) {
this.generateFileList(fileList, new File(node, filename), directory);
}
}
}
Остальная часть работы будет в конфигурации, которая должна быть достаточно простой. Он находится в конфигурации Partitioner, где вы можете установить размер сетки, который может быть даже выполнен динамически с использованием SpEL, если вы действительно собираетесь создавать n потоков для n файлов. Я бы поставил на то, что фиксированное количество потоков, работающих в n файлах, продемонстрировало бы значительное улучшение производительности, но вы сможете определить это для себя.