

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

# 檢測啟動程式碼
<a name="scorekeep-startup"></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)。

適用於 Java 的 X-Ray 開發套件會自動為傳入的請求建立區段。只要請求是在範圍內，您即可使用經檢測的用戶端並記錄子區段，而不會出現問題。如果您嘗試在啟動程式碼中使用經檢測的用戶端，則會收到 [SegmentNotFoundException](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/exceptions/SegmentNotFoundException.html)。

啟動程式碼會在 Web 應用程式的標準請求/回應流程之外執行，因此您需要手動建立區段以檢測起始程式碼。Scorekeep 會在其 `WebConfig` 檔案中顯示啟動程式碼的檢測。Scorekeep 會在啟動期間呼叫 SQL 資料庫和 Amazon SNS。

![\[Diagram showing client requests to Scorekeeper-init, which connects to SQL database and SNS.\]](http://docs.aws.amazon.com/zh_tw/xray/latest/devguide/images/scorekeep-servicemap-init.png)


預設`WebConfig`類別會為通知建立 Amazon SNS 訂閱。若要在使用 Amazon SNS 用戶端時提供 X-Ray 開發套件寫入的區段，Scorekeep 會在全域記錄器`endSegment`上呼叫 `beginSegment`和 。

**Example [https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/WebConfig.java#L49](https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/WebConfig.java#L49) – 啟動程式碼中的檢測 AWS SDK 用戶端**  

```
AWSXRay.beginSegment("Scorekeep-init");
if ( System.getenv("NOTIFICATION_EMAIL") != null ){
  try { Sns.createSubscription(); }
  catch (Exception e ) {
    logger.warn("Failed to create subscription for email "+  System.getenv("NOTIFICATION_EMAIL"));
  }
}
AWSXRay.endSegment();
```

在 `RdsWebConfig`Scorekeep 在連接 Amazon RDS 資料庫時使用的 中，組態也會為 SQL 用戶端建立區段，供 Hibernate 在啟動期間套用資料庫結構描述時使用。

**Example [https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/RdsWebConfig.java#L83](https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/RdsWebConfig.java#L83) – 在啟動程式碼中檢測 SQL 資料庫用戶端**  

```
@PostConstruct
public void schemaExport() {
  EntityManagerFactoryImpl entityManagerFactoryImpl = (EntityManagerFactoryImpl) localContainerEntityManagerFactoryBean.getNativeEntityManagerFactory();
  SessionFactoryImplementor sessionFactoryImplementor = entityManagerFactoryImpl.getSessionFactory();
  StandardServiceRegistry standardServiceRegistry = sessionFactoryImplementor.getSessionFactoryOptions().getServiceRegistry();
  MetadataSources metadataSources = new MetadataSources(new BootstrapServiceRegistryBuilder().build());
  metadataSources.addAnnotatedClass(GameHistory.class);
  MetadataImplementor metadataImplementor = (MetadataImplementor) metadataSources.buildMetadata(standardServiceRegistry);
  SchemaExport schemaExport = new SchemaExport(standardServiceRegistry, metadataImplementor);

  AWSXRay.beginSegment("Scorekeep-init");
  schemaExport.create(true, true);
  AWSXRay.endSegment();
}
```

`SchemaExport` 會自動執行，並使用 SQL 用戶端。由於用戶端已經過檢測，因此 Scorekeep 必須覆寫預設的實作，並提供呼叫用戶端時軟體開發套件使用的區段。