Я здесь реализую сверхпримитивную политику отсрочки. В идеале мне нужен ограничитель скорости, но сейчас я предпочитаю простое и быстрое решение.
Дело в том, что этот класс является компонентом Spring (@Component) и используется в в многопоточной среде несколько потоков будут использовать этот класс SessionHandler.
Код: Выделить всё
public String obtainSessionToken(String orgId,
String userId) throws UiSessionTokenGenerationException {
String sessionTokenJson;
int retriesRemaining = maxRetries;
while (true) {
try {
sessionTokenJson = browserSessionTokenService.getBrowserSessionToken(
orgId,
userId);
break;
} catch (Exception e) {
--retriesRemaining;
String message = "Error generating UI session token" ;
LOG.warn("{}, retriesRemaining={}", message, retriesRemaining);
if(retriesRemaining == 0)
throw new UiSessionTokenGenerationException(message);
int sleepMultiplier = maxRetries - retriesRemaining;
sleep(sleepMultiplier);
}
}
return extractSessionFromResponse(c2cTenant, recordId, sessionTokenJson);
}
private void sleep(int sleepMultiplier) {
try {
Thread.sleep(minSleepPeriod * sleepMultiplier);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
===========UPDATE==========
Позвольте мне уточнить мой вопрос: я предполагаю, что каждый вызывающий поток будет иметь свое собственное выполнение и не будет мешать выполнению другого потока, если только в классе с одиночной областью действия нет какого-либо кода, который используется всеми вызывающими потоками. Поскольку применяются спящие потоки для каждого вызывающего потока общая пропускная способность не пострадает. Верно ли это предположение? И, как таковой, этот класс может оставаться компонентом (одиночным элементом).
Подробнее здесь: https://stackoverflow.com/questions/760 ... ead-sleeps
Мобильная версия