Наше приложение будет по расписанию запускаться, например, каждый час, скачивать нужный нам файл и проверять: если файл изменился, то необходимо распарсить его заново. Если не изменился, то ничего с ним делать не нужно.
Компонент регистрации активности приложения как раз и будет сохранять в кеш Apache Ignite информацию о том, какие файлы уже были обработаны нашим приложением.
Ключом для кеша будет имя файла (включая путь к файлу), а значением - модель Activity с полями: путь к файлу и хэш-сумма файла.
@Data @AllArgsConstructor public class Activity { private String path; private String checkSum; }
Хэш-сумма файла будет вычисляться в приватном методе парсера файлов.
private String getChecksum(String path) { try { MessageDigest md = MessageDigest.getInstance("SHA-256"); md.update(Files.readAllBytes(Paths.get(path))); byte[] digest = md.digest(); return DatatypeConverter.printHexBinary(digest).toUpperCase(); } catch (Exception e) { log.error("Error get checksum for the file '{}'", path, e); } return null; }
Обновим тест парсера файлов, чтобы проверить, что один и тот же файл парсится только один раз.
@Test public void parseFile_shouldParseTheSameFileOnlyOnce() { parser.parse(path, line -> gson.fromJson(line, Review.class), reviewRepository::save); parser.parse(path, line -> gson.fromJson(line, Review.class), reviewRepository::save); verify(reviewRepository, times(26)).save(any(Review.class)); verify(activityRepository, times(2)).findById(path); verify(activityRepository, times(1)).save(any(Activity.class)); assertEquals(26, reviewRepository.count()); assertEquals(1, activityRepository.count()); }