Предположим, у меня на ftp-сервере хранится около 100 000 файлов (всего около 100 ГБ).В моей базе данных у меня есть 100 000 строк FILE_LOCATION
, которые содержат точное местоположение каждого файла на FTP-сервере.Теперь я хочу отправить все мои файлы с FTP-сервера на другой сервер через REST.Я создал инструмент, который выполняет следующее:
@Autowired
private FtpService ftpService;
@Autowired
private RestService restService;
@Autowired
private FileListProvider fileListProvider;
@Autowired
private LogService logService;
public void migrateFiles(){
List<Object> fileList = fileListProvider.getFileList(); // fetch list of ftp file locations
try {
ftpService.openconnection();
fileList.forEach(fileRecord -> {
File file = ftpService.fetchFile(fileRecord); //get single file
restService.sendFile(file); // send file to remote server
logService.logFileSend(file); // log file sending record into db
});
} catch (Exception e) {
e.printStackTrace();
} finally {
ftpService.closeConnection();
}
}
, это прекрасно работает, единственная проблема, которую я вижу, это производительность: около 6 секунд требуется для обработки одного файла (загрузка, загрузка, создание журнала),я, так как мой трансферт soeed может обрабатывать гораздо больше, а файлы ничего не делят друг с другом, я бы хотел сделать этот мультитач.Моя идея состоит в том, чтобы создать theard для каждой загрузки файла и обрабатывать их одновременно.Тем не менее, у меня есть некоторые проблемы и точка, в которой я застрял:
- Как я могу поделиться своими весенними бобами между тем?(Я попытался с помощью пользовательского класса Theard, реализующего Runnable, но не смог получить доступ к контексту Spring для извлечения bean-компонентов). Я не смог найти хорошего примера с конфигурацией на основе аннотаций
- Поскольку мое ftp-соединение и сеанс хранятся как приватная переменная в
ftpService
, этоbean должен быть разделен между theweene theards.Или мне следует создать новое соединение и сеанс для всех пользователей, чтобы они не мешали друг другу? - Simmilar Concert to Point 2 - для моего
logService
, так как создание новых сущностей, использующих генератор последовательностей из базы данных, неони мешают друг другу при создании? - я уверен, что есть лучший способ перебрать более 100 тыс. записей из базы данных, чем загрузка их в меморандум, является ли пейджинг лучшим способом или есть лучшее решение?
В настоящий момент я подсчитал, что весь процесс займет около 7 дней, моя цель - получить менее 2 дней.