Я реализовал следующий код. Я не могу думать ни о какой проблеме параллелизма, которая могла бы вызвать это, но все еще хочу мнение от экспертов.
Примечание. Контейнер будет создавать только один экземпляр сервлета, а его метод обслуживания будет вызываться несколькими потоками.
В частности, могут ли два потока одновременно вводить метод receiveToken ()? Может ли tokenDetails быть перезаписан несколькими потоками, выполняющими любой из этого кода параллельно?
public class MyServlet extends HttpServlet {
private static final long TOKEN_REFRESH_BUFFER_MILLIS =
PropertiesHelper.getLong(PROP_TOKEN_REFRESH_BUFFER, 300000);
private static Token tokenDetails = null;
private static long lokenExpiryTime = 0;
public void service(HttpServletRequest req, HttpServletResponse res) {
synchronized(this) {
if(tokenDetails == null ||
(lokenExpiryTime - System.currentTimeMillis()) < TOKEN_REFRESH_BUFFER_MILLIS ) {
tokenDetails = obtainToken();
lokenExpiryTime = System.currentTimeMillis() + tokenDetails.getExpiresIn() * 1000;
LOG.info("Token call returned...");
} else {
LOG.info("Reusing token from cache...");
}
}
.............
......
}
private synchronized Token obtainToken() throws IOException {
//Make an HTTP call to obtain token
..............
..............
return token;
}
}