Бин не обновляется в Mono.map - PullRequest
0 голосов
/ 25 октября 2018

Я уже некоторое время пытаюсь отладить эту проблему и не могу это сделать.Я хочу вызвать службу, для которой требуется токен доступа.Поэтому перед каждым вызовом службы я вызываю свой класс 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().Может ли кто-нибудь помочь мне с этим?

...