/
fedion
/
project_task
Обзор
Документация
Войти
/
fedion
/
project_task
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
project
cache-project/src/main/java/com/example/cache/service/RatesCache.java
54 строки
2 KB
Ioann
project
20 ноя 2025, 07:18
20 ноя 2025, 07:18
3eceee3
Код
Авторство
О чём код?
package com.example.cache.service; import com.example.cache.model.Rate; import lombok.AllArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Function; import java.util.stream.Collectors; import static java.lang.Thread.sleep; @AllArgsConstructor @Service public class RatesCache { private static final Logger log = LoggerFactory.getLogger(RatesCache.class); private final AtomicReference<Map<String, Rate>> rateCache = new AtomicReference<>(); private final RateController rateController; private final Lock updateLock = new ReentrantLock(); public boolean updateCache() { if (!updateLock.tryLock()) { return false; } try { var newData = rateController.getRates() .stream() .peek(r -> { log.info("Обновление валюты {}", r.getName()); try { sleep(1_500); } catch (InterruptedException e) { throw new RuntimeException(e); } }) .collect(Collectors.toUnmodifiableMap(Rate::getName, Function.identity())); rateCache.set(newData); return true; } finally { updateLock.unlock(); } } public Map<String, Rate> getRateCache() { return rateCache.get(); } }