本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在多线程应用程序中的线程之间传递分段上下文
在您的应用程序中创建新线程时,AWSXRayRecorder
不会维护对当前分段或子分段实体的引用。如果您在新线程中使用分析的客户端,开发工具包将尝试写入到不存在的分段,从而导致 SegmentNotFoundException。
要避免在开发期间引发异常,您可以使用指示记录器改为记录错误的 ContextMissingStrategy 配置记录器。您可以在代码中使用 SetContextMissingStrategy 配置策略,或使用环境变量或系统属性配置等效选项。
解决错误的一种方法是使用新分段:即在启动线程时调用 beginSegment,在关闭线程时调用 endSegment。如果您正在分析并非为响应 HTTP 请求而运行的代码,例如在您的应用程序启动时运行的代码,这很适合。
如果您使用多个线程处理传入请求,则可以将当前分段或子分段传递到新线程,并将其提供给全局记录器。这样可以确保对于新线程中记录的信息,相关联的分段与针对该请求记录的其余信息的关联分段相同。一旦分段在新线程中可用,您就可以使用
segment.run(() -> { ... })
方法执行任何可访问该分段的上下文的可运行操作。
有关示例,请参阅在工作线程中使用分析的客户端。
将 X-Ray 与异步编程结合使用
适用于 Java 的 X-Ray 开发工具包可用于使用 SegmentContextExecutors 的异步 Java 程序。实施执行程序接口,这意味着可以将其传递到 SegmentContextExecutorCompletableFuture
例 示例 App.java:将 SegmentContextExecutor 传递到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());