Делимся сервисами между темами весны - PullRequest
0 голосов
/ 28 января 2019

Предположим, у меня на 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 для каждой загрузки файла и обрабатывать их одновременно.Тем не менее, у меня есть некоторые проблемы и точка, в которой я застрял:

  1. Как я могу поделиться своими весенними бобами между тем?(Я попытался с помощью пользовательского класса Theard, реализующего Runnable, но не смог получить доступ к контексту Spring для извлечения bean-компонентов). Я не смог найти хорошего примера с конфигурацией на основе аннотаций
  2. Поскольку мое ftp-соединение и сеанс хранятся как приватная переменная в ftpService, этоbean должен быть разделен между theweene theards.Или мне следует создать новое соединение и сеанс для всех пользователей, чтобы они не мешали друг другу?
  3. Simmilar Concert to Point 2 - для моего logService, так как создание новых сущностей, использующих генератор последовательностей из базы данных, неони мешают друг другу при создании?
  4. я уверен, что есть лучший способ перебрать более 100 тыс. записей из базы данных, чем загрузка их в меморандум, является ли пейджинг лучшим способом или есть лучшее решение?

В настоящий момент я подсчитал, что весь процесс займет около 7 дней, моя цель - получить менее 2 дней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...