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



我正在升级我们的服务以使用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$0(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文档和故障排除页面,除了如何获取目的地之外,没有发现任何异常,但即使使用DestinationAccessor似乎也没有什么不同。此外,我没有进行任何异步或多租户处理。

如果您能在这方面提供任何帮助或指导,我们将不胜感激!

干杯!

这样的问题通常是由于缺少Spring Boot注释造成的,尤其是在同步执行中。

请参阅我们的文档,了解有关SAP Cloud SDK Spring Boot集成的更多信息。


编辑2022年2月28日

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

错误原因

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

计划缓解

与此同时,我们意识到这些WARN日志在消费者端造成了混乱。我们正在通过将消息的日志级别降级为INFO,将异常的日志级别降低为DEBUG来改善这种情况。

最新更新