无法获取 HttpClient 缓存 - 没有可用于线程 id=1 的 ThreadContext

Could not get HttpClient cache - No ThreadContext available for thread id=1

我正在努力升级我们的服务以使用 3.63.0(从 3.57.0 升级),我注意到以下警告(带有堆栈跟踪)显示在日志中,而以前的版本:

2022-02-18 14:03:41.038  WARN 1088 --- [           main] c.s.c.s.c.c.AbstractHttpClientCache      : Could not get HttpClient cache.

com.sap.cloud.sdk.cloudplatform.thread.exception.ThreadContextAccessException: No ThreadContext available for thread id=1.
    at com.sap.cloud.sdk.cloudplatform.thread.ThreadLocalThreadContextFacade.lambda$tryGetCurrentContext[=10=](ThreadLocalThreadContextFacade.java:39) ~[cloudplatform-core-3.63.0.jar:na]
    at io.vavr.Value.toTry(Value.java:1414) ~[vavr-0.10.4.jar:na]
    at com.sap.cloud.sdk.cloudplatform.thread.ThreadLocalThreadContextFacade.tryGetCurrentContext(ThreadLocalThreadContextFacade.java:37) ~[cloudplatform-core-3.63.0.jar:na]
    at io.vavr.control.Try.flatMapTry(Try.java:490) ~[vavr-0.10.4.jar:na]
    at io.vavr.control.Try.flatMap(Try.java:472) ~[vavr-0.10.4.jar:na]
    at com.sap.cloud.sdk.cloudplatform.thread.ThreadContextAccessor.tryGetCurrentContext(ThreadContextAccessor.java:84) ~[cloudplatform-core-3.63.0.jar:na]
    at com.sap.cloud.sdk.cloudplatform.connectivity.RequestScopedHttpClientCache.getCache(RequestScopedHttpClientCache.java:28) ~[cloudplatform-connectivity-3.63.0.jar:na]
    at com.sap.cloud.sdk.cloudplatform.connectivity.AbstractHttpClientCache.tryGetOrCreateHttpClient(AbstractHttpClientCache.java:78) ~[cloudplatform-connectivity-3.63.0.jar:na]
    at com.sap.cloud.sdk.cloudplatform.connectivity.AbstractHttpClientCache.tryGetHttpClient(AbstractHttpClientCache.java:46) ~[cloudplatform-connectivity-3.63.0.jar:na]
    at com.sap.cloud.sdk.cloudplatform.connectivity.HttpClientAccessor.tryGetHttpClient(HttpClientAccessor.java:153) ~[cloudplatform-connectivity-3.63.0.jar:na]
    at com.sap.cloud.sdk.cloudplatform.connectivity.HttpClientAccessor.getHttpClient(HttpClientAccessor.java:131) ~[cloudplatform-connectivity-3.63.0.jar:na]
    at com.octanner.mca.service.MarketingCloudApiContactService.uploadContacts(MarketingCloudApiContactService.java:138) ~[classes/:na]
    ...

进行以下调用时会发生这种情况...

使用较低级别API

HttpClient httpClient = HttpClientAccessor.getHttpClient(destination); // warning happens here
ODataRequestResultMultipartGeneric batchResult = requestBatch.execute(httpClient);

使用更高级别API

service
  .getAllContactOriginData()
  .withQueryParameter("$expand", "AdditionalIDs")
  .top(size)
  .filter(filter)
  .executeRequest(destination)); // warning happens here

即使此警告出现在日志中,服务请求仍按预期继续工作。看到这个有点担心,我想知道我是否配置有误。我查看了所有 java docs and the troubleshooting page,除了获取目的地的方式外没有发现任何异常,但即使使用 DestinationAccessor 似乎也没有什么不同。另外,我没有进行任何异步或多租户处理。

如能提供任何帮助或指导,我们将不胜感激!

干杯!

此类问题通常是缺少 Spring 引导注释的结果 - 特别是在同步执行中。

请参阅our documentation以了解有关 SAP Cloud SDK Spring 引导集成的更多信息。


编辑 2022 年 2 月 28 日

如果如果您的应用程序不需要任何 SAP Cloud SDK 的多租户功能,则忽略记录的警告是安全的。

错误原因

用于 Java 的 SAP Cloud SDK 最近(在版本 3.63.0 中)对 HttpClientCache 的线程传播行为进行了更改。 有了这个变化,我们还调整了日志记录,以防传播没有按预期工作——这通常是由于没有使用 ThreadContextExecutor 来包装异步操作造成的。 这就是问题作者描述的那种日志的原因。

计划缓解

与此同时,我们意识到这些 WARN 日志在消费者方面引起了混淆。 我们正在努力通过将消息的日志级别降级到 INFO 和异常的 DEBUG 来改善这种情况。