Как насчет использования семафора.Каждый входящий запрос будет пытаться получить блокировку с тайм-аутом, тогда вы можете быть уверены, что в случае успешного получения блокировки запрос обрабатывается мгновенно.Как это звучит?
Документация семафора: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html
Я бы использовал только один семафор, поэтому количество разрешений в семафоре будет фактически равно максимальному количеству соединений, разрешенных в системе.
Что касается количества подключений на пользователя, я бы сохранил счетчики пользовательских подключений в ConcurrentHashMap в реализации семафора, а затем настроил
public boolean tryAcquire(long timeout, TimeUnit unit, Long userId)
throws InterruptedException {
AtomicLong connCount = userConnetctionMap.contains(userId) ? userConnetctionMap.get(userId) : userConnetctionMap.put(userId, new AtomicLong(0));
if (connCount.get() < MAX_USER_CONN_COUNT) {
boolean locked = super.tryAcquire(timeout, unit);
if (locked) {
userConnetctionMap.get(userId).incrementAndGet();
return true;
}
}
return false;
}
, чтобы увеличить счетчик на идентификатор пользователя, если его числозначение conn меньше максимально допустимого
и настраиваемое действие:
releaseUSerConnection(userId)
уменьшит значение этого счетчика