在map.computeIfAbsent中运行阻塞代码会抛出错误

问题描述 投票:0回答:0

我必须在 lambda 函数中执行一些阻塞代码,该函数被传递给并发 hashmap 的 map.computeIfAbsent() 方法。 但是这会引发错误 - block()/blockFirst()/blockLast() 正在阻塞,这在主线程中不受支持。

  public Mono<String> getAccessToken(String applicationName) {

    Function<String, M2MApplicationTokenCache> mappingFunction = appName -> {
      M2MAccessToken accessToken = accessTokenWebClient.getAccessToken(applicationName).block();
      if (accessToken == null) {
        throw new AuthorizationTokenException(TOKEN_FETCH_FAILED_ERROR, appName);
      }
      return prepareCache(applicationName, accessToken); // return M2MApplicationTokenCache object
    };

    m2MApplicationTokenCaches.getCacheMap().computeIfAbsent(applicationName, mappingFunction);

    return m2MApplicationTokenCacheField
        .get(M2MApplicationTokenAggregatedKey.builder().applicationName(applicationName).build(), false)
        .map(M2MApplicationTokenAggregatedValue::getTokenValue)
        .doOnNext(out -> log.trace("Token Value : {}", out));
  }

我想在不同的线程上运行computeIfAbsent()方法并从我的缓存中返回一个令牌。 我已经探索过 mono.fromCallable() 但无法将代码放入其中。

spring-webflux concurrenthashmap
© www.soinside.com 2019 - 2024. All rights reserved.