Я пытаюсь обработать около 1000 файлов, используя следующий код:
ExecutorService executor = Executors.newFixedThreadPool(threadPoolSize);
Runnable worker = null;
for (File file : files) {
if (file.isFile()) {
worker = new FileProcessThread(file, connectionVo);
executor.execute(worker);
file.deleteOnExit();
}
}
while (!executor.isTerminated()) {
System.out.println("Still running");
}
executor.shutdown();
System.out.println("Finished all threads");
Этот код создает несколько потоков. Каждый поток имеет несколько вызовов rest внутри. Эти остальные API предназначены для обработки входного файла. Каждый поток также регистрирует каждое событие транзакции, которое происходит во время обработки. Но результат выполнения этих потоков несовместим.
- Для нескольких потоков он работает отлично. Выбирает файл. Регистрирует правильные
транзакции и перемещает обработанный файл в нужный каталог. - Но для некоторых потоков он показывает некоторое непредсказуемое поведение, например, регистрирует событие обработки файла одного потока в другом.
Шаги в каждом потоке:
- Создать транзакцию - оставшийся вызов
- Регистрировать событие в транзакции для запуска процесса — остаточный вызов
- Передает файл другому модулю для преобразования файла - остаточный вызов, который внутренне
создает еще один поток, который синхронизируется - После обработки файл перемещается в другой - в тот же каталог кода.
Мне нужна стабильная производительность этих потоков. Любая помощь будет оценена.
Код внутри запуска:
long transactionID = 0l;
long connectionId = connectionVo.getConnectionId();
try {
transactionID = beginTransaction.getTransactionId();
FileInputStream processedFileData;
processedFileData = new FileInputStream(file);
Response response = Service.postMessage(stream2file,
connectionId, 0, transactionID);
if (response.getStatus() != 200) {
writToDirectory(stream2file, userError, file.getName(), transactionID);
}
} else {
String userArchive = getUserArchive();
if (checkDirectory(userArchive, transactionID)) {
writToDirectory(stream2file, userArchive, file.getName(), transactionID);
}
}
file.delete();
} catch (FileNotFoundException e) {
}
threadPoolSize
должен быть меньше 1000, что является количеством обрабатываемых файлов. Таким образом, поток будет повторно использоваться для работы с разными файлами. - person tianwei   schedule 12.01.2016Future
. Отправьте свою задачу службе-исполнителю, чтобы получить будущую ссылку и, используя ее, запросить результат. Вы можете попробовать вернуть строку завершения, которая в вашем случае может бытьrest call name - log event - tran id
, и записать ее. - person Tirath   schedule 12.01.2016FileProcessThread
. Вы передаетеconnectionVo
, что звучит подозрительно (обычно вы не разделяете соединения между потоками) - person Enno Shioji   schedule 12.01.2016