Вот мой основной поток, внутри каждого процесса я вызываю потоки службы исполнителя. В строке 4, прежде чем обновлять статус, я хочу дождаться завершения всех моих потоков
line 1- missingStrategyContext.process(FileType.CARD, programId, fromDate, toDate, channel);
line 2- missingStrategyContext.process(FileType.TRANSACTION, programId, fromDate, toDate, channel);
line 3- missingStrategyContext.process(FileType.REFUND, programId, fromDate, toDate, channel);
line 4- processingLog.setProcessingStatus(TransactionState.SUCCESS.name());
Внутри каждого процесса я выбираю значение типа файла, какую стратегию мне нужно вызвать
public void process(FileType fileType, String programId, Long fromDate, Long toDate, String channel){
map.get(fileType).process(programId, fromDate, toDate, channel, fileType);
}
, а затем, в зависимости от типа файла, я реализовал свой метод процесса и вызвал службу исполнителя в каждой реализации типа файла
@Override
public void process(String programId, Long fromDate, Long toDate, String channel, FileType fileType) {
MultiTenantTxMgmt multiTenantTxMgmt = MultiTenantTxMgmtUtil.get(programId);
EntityManager entityManager = null;
List<MissingReason> reasonList = new ArrayList<>();
try {
entityManager = multiTenantTxMgmt.getEntityManager();
reasonList = missingDataRepository.getDistinctMissingReasonForFileType(entityManager, fileType, TransactionState.READYTOATTEMPT);
}catch (Exception exception) {
logger.error(exception.getMessage(), exception);
throw new UnkownBatchSaveException();
} finally {
entityManager.close();
}
reasonList.forEach(
missingReason -> deExecutorService.dotask(() ->
missingTransactionStrategyContext.processMissingV3(missingReason, programId, fromDate, toDate, channel, fileType)
)
);
}