Я уже некоторое время пытаюсь отладить эту проблему и не могу это сделать.Я хочу вызвать службу, для которой требуется токен доступа.Поэтому перед каждым вызовом службы я вызываю свой класс IdentityServiceConnector
, который дает мне токен доступа.
Теперь токены могут истечь.Поэтому для этой цели я использую ExpiringMap<k,V>
.Я создаю для него bean-компонент и срок его действия истекает:
@Bean
public ExpiringMap<String,String> expiringMap() {
ExpiringMap em = ExpiringMap.builder().expiration(1, TimeUnit.NANOSECONDS).build(); //expire this map after 1 nanosecond
em.put("accessToken", RandomStringUtils.randomAlphabetic(4));
return em;
}
Вот мой IdentityConnector.java
:
@Autowired private ExpiringMap<String, String> expiringMap;
public Mono<IssueToken> getServiceTokenFromIdentity() {
if (!Objects.isNull(expiringMap.get("accessToken"))) {
IssueToken issueToken = new IssueToken();
issueToken.setAccessToken(expiringMap.get("accessToken"));
return Mono.just(issueToken);
}
log.info("Access token expired, Making identity call");
IssueTokenRequest request =
IssueTokenRequest.builder()
.build();
URI issueTokenUrl =
UriComponentsBuilder.fromHttpUrl(identityContext.getIssueTokenUrl()).build().toUri();
long currentTime = System.currentTimeMillis();
return remoteCall(
HttpMethod.POST, issueTokenUrl, GsonConvertor.getInstance().serialize(request))
.map(this::getIssueToken)
.onErrorMap(
e -> {
LogContext logContext =
LogContext.builder()
.with(
LogConstants.Keys.TIMESTAMP,
DateUtils.getTransactionTime(System.currentTimeMillis()));
log.info(
Markers.appendEntries(logContext.build()),
"Some error occurred while calling identity service ");
throw new RuntimeException(e.getMessage());
});
}
А вот getIssueToken()
:
private IssueToken getIssueToken(ResponseEntity<String> response) {
HttpStatus statusCode = response.getStatusCode();
IssueToken issueToken =
GsonConvertor.getInstance().deserialize(response.getBody(), IssueToken.class);
expiringMap.put("accessToken", issueToken.getAccessToken());
expiringMap.setExpiration(issueToken.getExpiresIn(), TimeUnit.SECONDS);
return issueToken;
}
Таким образом, логика заключается в том, что всякий раз, когда вызывается getServiceTokenFromIdentity()
, он сначала проверяет, истек ли ExpiringMap
.Для самого первого вызова срок его действия истечет, и будет сгенерирован начальный токен доступа.Затем внутри getIssueToken()
я обновляю свой ExpiringMap
.Проблема, с которой я сталкиваюсь, заключается в том, что при каждом вызове getServiceTokenFromIdentity()
карта считается просроченной (не то, что время истечения обновленного токена составляет 1 час).
Короче говоря, мой компонент не обновляется внутриMono.map()
.Может ли кто-нибудь помочь мне с этим?