

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# マルチスレッドアプリケーションでのスレッド間のセグメントコンテキストの受け渡し
<a name="xray-sdk-java-multithreading"></a>

**注記**  
X-Ray SDK/デーモンメンテナンス通知 – 2026 年 2 月 25 日、 AWS X-Ray SDKsデーモンはメンテナンスモードに移行します。 AWS では、X-Ray SDK とデーモンのリリースがセキュリティの問題にのみ対処するように制限されます。サポートタイムラインの詳細については、「[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)」を参照してください。

アプリケーションで新しいスレッドを作成すると、`AWSXRayRecorder` は現在のセグメントまたはサブセグメント [Entity](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/entities/Entity.html) への参照を保持しません。実装されたクライアントを新しいスレッドで使用すると、SDK は存在しないセグメントに書き込みを試み、[SegmentNotFoundException](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/exceptions/SegmentNotFoundException.html) が発生します。

開発中に例外をスローしないようにするには、代わりにエラーを記録するよう指示する [ContextMissingStrategy](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/strategy/ContextMissingStrategy.html) でレコーダーを設定します。[SetContextMissingStrategy](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/AWSXRayRecorder.html#setContextMissingStrategy(com.amazonaws.xray.strategy.ContextMissingStrategy)) を使用してコード内に戦略を設定するか､[環境変数](xray-sdk-java-configuration.md#xray-sdk-java-configuration-envvars) または [システムプロパティ](xray-sdk-java-configuration.md#xray-sdk-java-configuration-sysprops)を使用して同等のオプションを設定することができます｡

エラーに対処する 1 つの方法として、スレッドを開始するときに [beginSegment](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/AWSXRayRecorder.html#beginSegment(java.lang.String)) を呼び出して新しいセグメントを使用する方法と､スレッドを終了するときに [endSegment](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/AWSXRayRecorder.html#endSegment--) を使用する方法があります｡ これは、アプリケーションの起動時に実行されるコードのように、HTTP リクエストに応答して実行されないコードを実装する場合に機能します。

複数のスレッドを使用して着信リクエストを処理する場合は、現在のセグメントまたはサブセグメントを新しいスレッドに渡してグローバルレコーダーに渡すことができます。これにより、新しいスレッド内に記録された情報が、そのリクエストに関して記録された残りの情報と同じセグメントに関連付けられることが保証されます。新しいスレッドでセグメントが使用可能になると、そのセグメントのコンテキストにアクセスできる任意の実行可能なファイルを `segment.run(() -> { ... })` メソッドで実行できるようになります。

例については、「[実装されたクライアントをワーカースレッドで使用する](scorekeep-workerthreads.md)」を参照してください。

## 非同期プログラミングでの X-Ray の使用
<a name="using-asynchronous-programming"></a>

 X-Ray SDK for Java は、[SegmentContextExecutors](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/contexts/SegmentContextExecutors.html) を使用した非同期 Java プログラムで使用できます。SegmentContextExecutor は Executor インターフェイスを実装しており、[CompletableFuture](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html) のすべての非同期操作に渡せます。これにより、非同期オペレーションがそのコンテキスト内で正しいセグメントで実行されることが保証されます。

**Example 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());
```