Синхронизация запросов по значению свойства телаJAVA

Программисты JAVA общаются здесь
Anonymous
Синхронизация запросов по значению свойства тела

Сообщение Anonymous »

Предположим, у вас есть REST-сервер. Spring WebFlux, Hibernate, обычное дело.
Необходимо убедиться, что все 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.

Вернуться в «JAVA»