

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 작업자 스레드에서 구성된 클라이언트 사용
<a name="scorekeep-workerthreads"></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)을 참조하세요.

Scorekeep은 작업자 스레드를 사용하여 사용자가 게임에서 이길 때 Amazon SNS에 알림을 게시합니다. 알림을 게시하는 작업은 결합된 요청 작업의 나머지를 수행할 때보다 더 많은 시간이 걸리며 클라이언트 또는 사용자에게 영향을 주지 않습니다. 따라서 이 작업을 비동기식으로 수행하는 것은 응답 시간을 개선하는 좋은 방법입니다.

그러나 Java용 X-Ray SDK는 스레드가 생성될 때 어떤 세그먼트가 활성화되었는지 알지 못합니다. 따라서 스레드 내에서 계측된 AWS SDK for Java 클라이언트를 사용하려고 하면가 발생하고 스레드가 `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 SDK가 Amazon SNS의 응답을 기록하기 전에 세그먼트를 닫지 않습니다. Scorekeep이 요청을 해결할 때 열려 있는 세그먼트가 없으면 Amazon SNS의 응답이 손실될 수 있습니다.

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


멀티스레딩에 대한 자세한 내용은 [멀티스레드 애플리케이션에서 스레드 간 세그먼트 컨텍스트 전달](xray-sdk-java-multithreading.md) 섹션을 참조하세요.