Необходимо убедиться, что все POST-запросы с одинаковым значением свойства body обрабатываются последовательно. Скажем, «slotId»: на данный интервал приема может претендовать не более одного пациента. Такие запросы должны обрабатываться один за другим (второй благополучно завершится ошибкой).
Одно такое свойство у нас уже есть (
Код: Выделить всё
"referralId"). Теперь нам также нужно синхронизироваться по вышеупомянутому «slotId»Код: Выделить всё
DbAppointmentResult src = sync.referralIdSync(referralId, () -> daoApi.setappointment(organizationId, referralId, patientId, slotId, previousSlotId));
Код: Выделить всё
// it's not my code, God forbid
import org.springframework.stereotype.Component;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Supplier;
@Component
public class Sync {
private ConcurrentHashMap map = new ConcurrentHashMap();
public T referralIdSync(String referralId, Supplier sup) {
AtomicInteger obj = new AtomicInteger();
AtomicInteger mon = map.putIfAbsent(referralId, obj);
if (mon==null) {
mon = obj;
}
mon.incrementAndGet();
try {
synchronized(mon){
return sup.get();
}
} finally {
if (mon.decrementAndGet()==0) {
map.remove(referralId);
}
}
}
}
Как лучше всего этого добиться? Я уверен, что это было реализовано в Spring.
Java 8.