

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在工作者執行緒中使用受檢測用戶端
<a name="scorekeep-workerthreads"></a>

**注意**  
X-Ray 開發套件/協助程式維護通知 – 在 2026 年 2 月 25 日， AWS X-Ray SDKs/協助程式將進入維護模式，其中 AWS 將限制 X-Ray 開發套件和協助程式版本，以僅解決安全問題。如需支援時間軸的詳細資訊，請參閱 [X-Ray SDK 和協助程式支援時間表](xray-sdk-daemon-timeline.md)。建議您遷移至 OpenTelemetry。如需遷移至 OpenTelemetry 的詳細資訊，請參閱[從 X-Ray 檢測遷移至 OpenTelemetry 檢測](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-migration.html)。

Scorekeep 使用工作者執行緒，在使用者獲勝時將通知發佈至 Amazon SNS。發佈通知所花費的時間比其餘合併的請求操作更長，但不會影響用戶端或使用者。因此，若要改善回應時間，以非同步方式執行任務是一種好方法。

不過，適用於 Java 的 X-Ray 開發套件不知道在建立執行緒時哪個區段處於作用中狀態。因此，當您嘗試在執行緒中使用經檢測的 適用於 Java 的 AWS SDK 用戶端時，它會擲回 `SegmentNotFoundException`，使執行緒當機。

**Example web-1.error.log**  

```
Exception in thread "Thread-2" com.amazonaws.xray.exceptions.SegmentNotFoundException: Failed to begin subsegment named 'AmazonSNS': segment cannot be found.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
...
```

為了修正此問題，應用程式會使用 `GetTraceEntity`取得主執行緒中區段的參考，並`Entity.run()`安全地執行具有區段內容存取權的工作者執行緒程式碼。

**Example [https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/MoveFactory.java#L70](https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/MoveFactory.java#L70) – 將追蹤內容傳遞至工作者執行緒**  

```
import [com.amazonaws.xray.AWSXRay](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/AWSXRay.html);
import [com.amazonaws.xray.AWSXRayRecorder](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/AWSXRayRecorder.html);
import [com.amazonaws.xray.entities.Entity](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/entities/Entity.html);
import [com.amazonaws.xray.entities.Segment](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/entities/Segment.html);
import [com.amazonaws.xray.entities.Subsegment](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/entities/Subsegment.html);
...
      Entity segment = recorder.getTraceEntity();
      Thread comm = new Thread() {
        public void run() {
         segment.run(() -> {
            Subsegment subsegment = AWSXRay.beginSubsegment("## Send notification");
            Sns.sendNotification("Scorekeep game completed", "Winner: " + userId);
            AWSXRay.endSubsegment();
          }
        }
```

由於請求現在會在呼叫 Amazon SNS 之前解決，因此應用程式會為執行緒建立單獨的子區段。這可防止 X-Ray 開發套件在記錄來自 Amazon SNS 的回應之前關閉區段。如果 Scorekeep 解決請求時未開啟任何子區段，Amazon SNS 的回應可能會遺失。

![\[\]](http://docs.aws.amazon.com/zh_tw/xray/latest/devguide/images/scorekeep-workerthread.png)


如需多執行緒的詳細資訊，請參閱[在多執行緒應用程式之間傳遞區段內容](xray-sdk-java-multithreading.md)。