В API часто бывает повторы задач, что бы защититься от этого можно использовать Idempotency-key.
Создаём хранилище ключей с временем истечения:
record Entry(String response, long expireAt) {}
var store = new java.util.concurrent.ConcurrentHashMap<String, Entry>();Функция для проверки/выполнения операции по ключу:
String handle(String key, java.util.function.Supplier<String> action, long ttlMs) {
long now = System.currentTimeMillis();
var saved = store.get(key);
if (saved != null && saved.expireAt() > now) return saved.response();Если ключ новый выполняем действие и сохраняем ответ:
var result = action.get();
store.put(key, new Entry(result, now + ttlMs));
return result;
}
Пример: один и тот же ключ возвращает один и тот же ответ:
var key = "pay:order-42";
var r1 = handle(key, () -> "OK#" + java.util.UUID.randomUUID(), 60000);
var r2 = handle(key, () -> "OK#" + java.util.UUID.randomUUID(), 60000);
System.out.println(r1);
System.out.println(r2);
Теперь повторные запросы с тем же ключом не выполняют операцию повторно.
👉 Java Ready | #практика