在多线程应用程序中的线程之间传递段上下文 - Amazon X-Ray
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在多线程应用程序中的线程之间传递段上下文

在您的应用程序中创建新线程时,AWSXRayRecorder 不会维护对当前分段或子分段实体的引用。如果您在新线程中使用分析的客户端,开发工具包会尝试写入到不存在的分段,这会导致出现 SegmentNotFoundException

要避免在开发过程中引发异常,您可以使用 ContextMissingStrategy 配置记录器,改为让它记录错误。您可以在代码中使用 SetContextMissingStrategy 配置策略,或者使用环境变量系统属性配置等效选项。

解决错误的一种方法是使用新分段:在您启动线程时调用 beginSegment,并在您将其关闭时调用 endSegment。如果您正在分析并非为响应 HTTP 请求而运行的代码,例如在您的应用程序启动时运行的代码,这很适合。

如果您使用多个线程来处理传入请求,您可以将当前分段或子分段传递到新线程,并将其提供给全局记录器。这样可以确保对于新线程中记录的信息,相关联的分段与针对该请求记录的其余信息的关联分段相同。一旦该段在新线程中可用,您就可以使用segment.run(() -> { ... })方法。

有关示例,请参阅在工作线程中使用分析客户端

将 X-Ray 与异步编程结合使用

适用于 Java 的 X-Ray 软件开发工具包可用于具有分段上下文操作器]。SegmentContexCecutor 实现了执行器接口,这意味着它可以传递到CompletableFuture]。这可确保任何异步操作都将在其上下文中使用正确的段执行。

例 示例 App.java:将区段上下文执行器传递给 CompletableFuture

DynamoDbAsyncClient client = DynamoDbAsyncClient.create(); AWSXRay.beginSegment(); // ... client.getItem(request).thenComposeAsync(response -> { // If we did not provide the segment context executor, this request would not be traced correctly. return client.getItem(request2); }, SegmentContextExecutors.newSegmentContextExecutor());