

AWS Mainframe Modernization Service （受管執行期環境體驗） 不再開放給新客戶使用。對於與 AWS Mainframe Modernization Service （受管執行期環境體驗） 類似的功能，探索 AWS Mainframe Modernization Service （自我管理體驗）。現有客戶可以繼續正常使用該服務。如需詳細資訊，請參閱[AWS 大型主機現代化可用性變更](https://docs.aws.amazon.com/m2/latest/userguide/mainframe-modernization-availability-change.html)。

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

# AWS 現代化應用程式大型主機結構的轉換
<a name="ba-shared-structure"></a>

本文件提供有關現代化應用程式結構的詳細資訊 （使用 AWS 大型主機現代化重構工具），以便開發人員可以完成各種任務，例如：
+ 順利導覽至應用程式。
+ 開發可從現代化應用程式呼叫的自訂程式。
+ 安全地重構現代化應用程式。

我們假設您已具備下列基本知識：
+ 舊版常見編碼概念，例如記錄、資料集及其對記錄的存取模式 -- 已編製索引、循序 --、VSAM、執行單位、jcl 指令碼、CICS 概念等。
+ 使用 [Spring 架構](https://spring.io/projects/spring-framework)進行 Java 編碼。
+ 在整個文件中，我們使用 `short class names` 來提供可讀性。如需詳細資訊，請參閱 [AWS 大型主機完整名稱映射的轉換](#ba-shared-structure-fqn-table) 擷取大型主機執行時間元素 AWS 轉換的對應完整名稱[第三方完整名稱映射](#ba-shared-structure-3pfqn-table)，以及擷取第三方元素的對應完整名稱。
+ 所有成品和範例都取自範例 COBOL/CICS [CardDemo 應用程式的](https://github.com/aws-samples/aws-mainframe-modernization-carddemo)現代化程序輸出。

**Topics**
+ [成品組織](#ba-shared-structure-org)
+ [執行和呼叫程式](#ba-shared-structure-run-call)
+ [撰寫您自己的程式](#ba-shared-structure-write)
+ [完整名稱映射](#ba-shared-structure-fqn)

## 成品組織
<a name="ba-shared-structure-org"></a>

AWS 大型主機現代化應用程式的轉換會封裝為 java Web 應用程式 (.war)，您可以在 JEE 伺服器上部署。一般而言，伺服器是 [Tomcat](https://tomcat.apache.org/) 執行個體，內嵌大型主機執行期的 AWS 轉換，目前建置在 [Springboot](https://spring.io/projects/spring-boot) 和 [Angular](https://angular.io/) （適用於 UI 部分） 架構上。

戰會彙總數個元件成品 (.jar)。每個 jar 都是專用 Java 專案的編譯結果 （使用 [maven](https://maven.apache.org/) 工具），其元素是現代化程序的結果。

![\[範例現代化應用程式成品。\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/modernized_application_artifacts.png)


基本組織依賴下列結構：
+ 實體專案： 包含商業模型和內容元素。專案名稱通常以「實體」結尾。一般而言，對於指定的舊版 COBOL 程式，這相當於 I/O 區段 （資料集） 和資料分割的現代化。您可以有一個以上的實體專案。
+ 服務專案： 包含傳統商業邏輯現代化元素。一般而言，COBOL 程式的程序分割。您可以有一個以上的服務專案。
+ 公用程式專案：包含其他專案使用的共用常見工具和公用程式。
+ Web 專案：適用時包含 UI 相關元素的現代化。不用於僅限批次的現代化專案。這些 UI 元素可能來自 CICSBMS 映射、IMSMFS 元件和其他大型主機 UI 來源。您可以有多個 Web 專案。

### 實體專案內容
<a name="ba-shared-structure-org-entities"></a>

**注意**  
下列描述僅適用於 COBOL 和 PL/I 現代化輸出。RPG 現代化輸出是以不同的配置為基礎。

在任何重構之前，實體專案中的套件組織會與現代化程式繫結。您可以用幾種不同的方式來完成此操作。偏好的方式是使用重構工具箱，其會在您觸發程式碼產生機制之前運作。這是進階操作，在適用於大型主機訓練的 AWS 轉換中說明。如需詳細資訊，請參閱[重構研討會](https://catalog.workshops.aws/aws-blu-age-l3-certification-workshop/en-US/refactoring)。此方法可讓您保留稍後重新產生 Java 程式碼的功能，以受益於未來的進一步改善，例如）。另一種方法是使用您可能想要套用的任何 Java 重構方法，直接在產生的原始程式碼上執行定期 Java 重構，風險由您自行承擔。

![\[範例程式 CBACT04C 實體套件。\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/entities_packages.png)


#### 程式相關類別
<a name="ba-shared-structure-org-entities-program"></a>

每個現代化計劃都與兩個套件相關：Business.context 和 business.model 套件。
+ `base package.program.business.context`

  business.context 子套件包含兩個類別，一個組態類別和一個內容類別。
  + 程式的一個組態類別，其中包含指定程式的特定組態詳細資訊，例如用來表示字元型資料元素的字元集、填補資料結構元素的預設位元組值等。類別名稱結尾為 "Configuration"。它會標記`@org.springframework.context.annotation.Configuration`註釋，並包含必須傳回正確設定`Configuration`物件的單一方法。  
![\[Java 中的範例組態。\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/sample_configuration.png)
  + 一種內容類別，做為程式服務類別 （請參閱下文） 與模型子套件中的資料結構 (`Record`) 和資料集 (`File`) 之間的橋樑 （請參閱下文）。類別名稱以「內容」結尾，是 `RuntimeContext` 類別的子類別。  
![\[範例內容類別 （部分檢視）\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/sample_context.png)
+ `base package.program.business.model`

  模型子套件包含指定程式可以使用的所有資料結構。例如，任何 01 層級的 COBOL 資料結構都會對應至模型子套件中的類別 （較低層級的資料結構是其擁有 01 層級結構的屬性）。如需如何現代化 01 資料結構的詳細資訊，請參閱[什麼是大型主機 AWS Transform 中的資料簡化程式](ba-shared-data.md)。  
![\[範例記錄實體 （部分檢視）\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/sample_record_entity.png)

所有類別都會擴展 `RecordEntity`類別，代表對業務記錄表示法的存取。有些記錄具有特殊用途，因為它們繫結至 `File`。在建立檔案物件時，`File`會在內容類別中找到的對應 \$1FileHandler 方法中建立 `Record`和 之間的繫結。例如，以下清單顯示 TransactfileFile `File` 如何繫結至 transactFile `Record`（從模型子套件）。

![\[檔案繫結的範例記錄。\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/sample_record_file_binding.png)


### 服務專案內容
<a name="ba-shared-structure-org-service"></a>

每個服務專案都隨附專用的 [Springboot](https://spring.io/projects/spring-boot) 應用程式，做為架構的骨幹。這是透過名為 的類別具體化`SpringBootLauncher`，位於服務 Java 來源的基本套件中：

![\[服務專案 SpringBoot 應用程式。\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/springbootlauncher.png)


此類別明顯負責：
+ 在程式類別與受管資源 （資料來源/交易管理員/資料集映射/等） 之間進行黏附。
+ `ConfigurableApplicationContext` 將 提供給程式。
+ 探索標示為彈簧元件 () 的所有類別`@Component`。
+ 確保程式在 `ProgramRegistry` 中正確註冊 -- 請參閱負責此註冊的初始化方法。

![\[程式註冊。\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/programs_registration.png)


#### 程式相關成品
<a name="ba-shared-structure-org-service-program"></a>

若未事先重構，業務邏輯現代化輸出會依每個舊版程式的兩個或三個套件進行組織：

![\[範例程式套件。\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/sample_program_packages.png)


最詳盡的案例將包含三個套件：
+ `base package.program.service`：包含名為 *Program* Process 的界面，其具有處理商業邏輯的業務方法，可保留舊版執行控制流程。
+ `base package.program.service.impl`：包含名為 *Program*ProcessImpl 的類別，這是上述程序界面的實作。這是舊版陳述式「轉譯」為 Java 陳述式的地方，依賴大型主機架構的 AWS 轉換：  
![\[範例現代化 CICS 陳述式 （傳送 MAP、接收 MAP)\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/sample_cics_statements.png)
+ `base package.program.statemachine`：此套件可能不總是存在。當傳統控制流程的現代化必須使用狀態機器方法 （即使用 [Spring StateMachine 架構](https://spring.io/projects/spring-statemachine)) 來正確涵蓋傳統執行流程時，這是必要的。

  在這種情況下，狀態機器子套件包含兩個類別：
  + `ProgramProcedureDivisionStateMachineController`：擴展實作 `StateMachineController`（定義控制狀態機器執行所需的操作） 和 `StateMachineRunner`（定義執行狀態機器所需的操作） 介面的類別，用於驅動 Spring 狀態機器機制；例如，`SimpleStateMachineController`如範例案例所示。  
![\[狀態機器控制器範例。\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/sample_statemachine_controller.png)

    狀態機器控制器會定義可能的可能不同狀態及其之間的轉換，以重現指定程式的舊版執行控制流程。

    建置狀態機器時，控制器是指在狀態機器套件中相關聯的服務類別中定義的方法，如下所述：

    ```
    subConfigurer.state(States._0000_MAIN, buildAction(() -> {stateProcess._0000Main(lctx, ctrl);}), null);
    subConfigurer.state(States.ABEND_ROUTINE, buildAction(() -> {stateProcess.abendRoutine(lctx, ctrl);}), null);
    ```
  + `ProgramProcedureDivisionStateMachineService`：此服務類別代表一些業務邏輯，這些邏輯必須與狀態機器控制器建立的狀態機器繫結，如前所述。

    此類別的方法中的程式碼使用狀態機器控制器中定義的事件：  
![\[使用 statemachine 控制器事件的 Statemachine 服務。\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/service_using_event_1.png)  
![\[使用 statemachine 控制器事件的 Statemachine 服務。\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/service_using_event_2.png)

    狀態機器服務也會呼叫上述的程序服務實作：  
![\[.statemachine 服務呼叫程序實作\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/service_using_processimpl.png)

此外，名為 的套件`base package.program`會扮演重要角色，因為它會為每個程式收集一個類別，做為程式進入點 （稍後對此有更多詳細資訊）。每個類別都會實作`Program`界面，即程式進入點的標記。

![\[程式進入點\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/programs.png)


#### 其他成品
<a name="ba-shared-structure-org-service-other"></a>
+ BMS MAPs配套

  除了程式相關的成品之外，服務專案還可以包含其他成品以供各種用途使用。在 CICS 線上應用程式的現代化情況下，現代化程序會產生 json 檔案，並放入 /src/main/resources 資料夾的映射資料夾中：  
![\[在資源資料夾中的 BMS MAPs json 檔案。\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/maps_json_files.png)

  AWS Transform for mainframe 執行時間會使用這些 json 檔案，將 SEND MAP 陳述式所使用的記錄與畫面欄位繫結。
+ Groovy 指令碼

  如果舊版應用程式具有 JCL 指令碼，則這些指令碼已現代化為 [groovy](https://groovy-lang.org/) 指令碼，並存放在 /src/main/resources/scripts 資料夾中 （稍後該特定位置的詳細資訊）：  
![\[groovy 指令碼 (JCL 現代化）\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/groovy_scripts.png)

  這些指令碼用於啟動批次任務 （專用、非互動式、密集 cpu 的資料處理工作負載）。
+ SQL 檔案

  如果舊版應用程式使用 SQL 查詢，則會使用命名模式 *program*.sql，在專用屬性檔案中收集對應的現代化 SQL 查詢，其中 *program* 是使用這些查詢的程式名稱。  
![\[資源資料夾中的 SQL 檔案\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/sql_files.png)

  這些 sql 檔案的內容是 (key=query) 項目的集合，其中每個查詢都與唯一索引鍵相關聯，而現代化程式會使用這些索引鍵來執行指定的查詢：  
![\[現代化程式使用的 sql 檔案範例。\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/sample_sql_file.png)

  例如，COSGN00C 程式正在執行索引鍵為 "COSGN00C\$11" 的查詢 (sql 檔案的第一個項目）：  
![\[依程式的範例查詢用量\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/sample_sql_query_usage.png)

### 公用程式專案內容
<a name="ba-shared-structure-org-utilities"></a>

公用程式專案的名稱以「工具」結尾，包含一組技術公用程式，可供所有其他專案使用。

![\[公用程式專案內容\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/tools_project.png)


### Web 專案 （多個） 內容
<a name="ba-shared-structure-org-web"></a>

Web 專案只有在現代化舊版 UI 元素時才存在。用來建置現代化應用程式的現代 UI 元素是以 [Angular](https://angular.io/) 為基礎。用來顯示現代化成品的範例應用程式是在大型主機上執行的 COBOL/CICS 應用程式。CICS 系統使用 MAPs 來代表 UI 畫面。對於每個映射，對應的現代元素將是 html 檔案，並隨附 [Typescript](https://www.typescriptlang.org/) 檔案：

![\[現代化為角度的 CICS 映射範例\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/sample_cics_maps_angular.png)


Web 專案僅負責應用程式的前端方面。依賴 公用程式和實體專案的服務專案提供後端服務。前端和後端之間的連結是透過名為 Gapwalk-Application 的 Web 應用程式建立，這是大型主機執行期分佈標準 AWS 轉換的一部分。

## 執行和呼叫程式
<a name="ba-shared-structure-run-call"></a>

在舊版系統上，程式會編譯為獨立的可執行檔，可透過 COBOL CALL 陳述式等 CALL 機制呼叫自己，並在需要時傳遞引數。現代化應用程式提供相同的功能，但使用不同的方法，因為涉及成品的性質與舊版成品不同。

在現代化方面，程式進入點是實作`Program`界面的特定類別，是 Spring 元件 (@Component)，位於名為 的套件中的服務專案中`base package.program`。

### 程式註冊
<a name="ba-shared-structure-run-call-register-programs"></a>

每次啟動託管現代化應用程式的 [Tomcat](https://tomcat.apache.org/) 伺服器時，也會啟動服務 Springboot 應用程式，這會觸發程式註冊。名為 的專用登錄`ProgramRegistry`檔會填入程式項目，每個使用其識別符註冊的程式，每個已知程式識別符各一個項目，這表示如果程式是由數個不同的識別符所知道，登錄檔會包含任意數量的項目，其中有識別符。

指定程式的註冊依賴於 getProgramIdentifiers() 方法傳回的識別符集合：

![\[範例程式 （部分檢視）\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/sample_program.png)


在此範例中，程式註冊一次，名稱為 'CBACT04C' （查看 programIdentifiers 集合的內容）。tomcat 日誌會顯示每個程式註冊。程式註冊僅取決於宣告的程式識別符，而非程式類別名稱本身 （雖然通常符合程式識別符和程式類別名稱。

相同的註冊機制適用於大型主機 Web 應用程式的各種公用程式 AWS Transform 帶來的公用程式程式，這是大型主機執行期分佈 AWS 的 Transform 的一部分。例如，Gapwalk-Utility-Pgm Webapp 提供 z/OS 系統公用程式 (IDCAMS、ICEGENER、SORT 等） 的功能對等項目，並且可由現代化程式或指令碼呼叫。在 Tomcat 啟動時註冊的所有可用公用程式都會記錄在 Tomcat 日誌中。

### 指令碼和協助程式註冊
<a name="ba-shared-structure-run-call-register-scripts"></a>

在 Tomcat 啟動時間，位於 /src/main/resources/scripts 資料夾階層的 groovy 指令碼會發生類似的註冊程序。指令碼資料夾階層會周遊，而探索到的所有 groovy 指令碼 （特殊 function.groovy 預留指令碼除外） 會使用其簡短名稱 （指令碼檔案名稱的一部分，位於第一個點字元之前） 做為擷取金鑰`ScriptRegistry`，在 中註冊。

**注意**  
如果多個指令碼的檔案名稱會導致產生相同的註冊金鑰，則只會註冊最新的 ，並覆寫該指定金鑰先前遇到的任何註冊。
考量上述注意事項，當使用子資料夾做為註冊機制時，請注意 會扁平化階層，並可能導致非預期的覆寫。階層不會計入註冊程序中：通常 /scripts/A/myscript.groovy 和 /scripts/B/myscript.groovy 會導致 /scripts/B/myscript.groovy 覆寫 /scripts/A/myscript.groovy。

/src/main/resources/daemons 資料夾中的 groovy 指令碼處理方式略有不同。它們仍然註冊為一般指令碼，但此外，它們會在 Tomcat 啟動時間以非同步方式直接啟動一次。

在 中註冊指令碼後`ScriptRegistry`，REST 呼叫可以使用 Gapwalk-Application 公開的專用端點來啟動它們。如需詳細資訊，請參閱對應的文件。

### 呼叫程式的程式
<a name="ba-shared-structure-run-call-programs"></a>

每個程式都可以呼叫另一個程式做為子程式，並將參數傳遞給它。程式會使用 `ExecutionController` 界面的實作來執行此操作 （大多數時候，這會是`ExecutionControllerImpl`執行個體），以及名為 的流暢 API 機制`CallBuilder`來建置程式呼叫引數。

所有程式方法都採用 `RuntimeContext`和 `ExecutionController`作為方法引數，因此 `ExecutionController` 一律可用於呼叫其他程式。

例如，請參閱下圖，其中顯示 CBST03A 程式如何將 CBST03B 程式呼叫為子程式，並將參數傳遞給程式：

![\[.sub-program 呼叫範例\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/subprogram_call_sample.png)

+ 的第一個引數`ExecutionController.callSubProgram`是要呼叫的程式識別符 （也就是用於程式註冊的其中一個識別符 -- 請參閱上述段落）。
+ 第二個引數是 建置的結果`CallBuilder`，是 的陣列`Record`，對應於從來電者傳遞給來電者的資料。
+ 第三個和最後一個引數是呼叫者`RuntimeContext`執行個體。

這三個引數都是強制性的，不能是 null，但第二個引數可以是空的陣列。

只有在原本設計時，受話方才能處理傳遞的參數。對於舊版 COBOL 程式，這表示具有 LINKAGE 區段和 USING 子句，讓程序分區使用 LINKAGE 元素。

例如，請參閱對應的 [CBSTM03B.CBL](https://github.com/aws-samples/aws-mainframe-modernization-carddemo/blob/main/app/cbl/CBSTM03B.CBL) COBOL 來源檔案：

![\[COBOL 來源檔案中的範例連結\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/linkage_sample.png)


因此，CBSTM03B 程式採用單一 `Record`做為參數 （大小為 1 的陣列）。這是 `CallBuilder` 所建置的內容，使用 byReference() 和 getArguments() 方法鏈結。

`CallBuilder` 流暢的 API 類別有數種方法可用來填入要傳遞給受話方的引數陣列：
+ asPointer(RecordAdaptable)：新增指標種類的引數，參考。指標代表目標資料結構的地址。
+ byReference(RecordAdaptable)：依參考新增引數。發起人將看到受話方執行的修改。
+ byReference(RecordAdaptable)：上一個方法的 varargs 變體。
+ byValue(Object)：新增 引數，依`Record`值轉換為 。發起人不會看到被發起人執行的修改。
+ byValue(RecordAdaptable)：與先前的方法相同，但引數可直接做為 使用`RecordAdaptable`。
+ byValueWithBounds(Object， int， int)：新增 引數，轉換為 `Record`，依值擷取指定邊界定義的位元組陣列部分。

最後，getArguments 方法會收集所有新增的引數，並以 陣列傳回這些引數`Record`。

**注意**  
發起人的責任是確保引數陣列具有所需的大小，以確保項目在記憶體配置方面具有連結元素的預期配置，具有正確排序和相容。

### 指令碼呼叫程式
<a name="ba-shared-structure-run-call-scripts"></a>

從 groovy 指令碼呼叫已註冊的程式需要使用實作`MainProgramRunner`界面的類別執行個體。通常，透過 Spring 的 ApplicationContext 使用方式來取得這類執行個體：

![\[.MainProgramRunner：取得執行個體\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/mpr.png)


在`MainProgramRunner`介面可用後，使用 runProgram 方法呼叫程式，並將目標程式的識別符做為參數傳遞：

![\[MainProgramRunner：執行程式\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/mpr_runprogram.png)


在先前的範例中，任務步驟會呼叫 IDCAMS （檔案處理公用程式程式），提供實際資料集定義與其邏輯識別符之間的映射。

處理資料集時，舊版程式大多使用邏輯名稱來識別資料集。從指令碼呼叫程式時，指令碼必須對應邏輯名稱與實際的實體資料集。這些資料集可能位於檔案系統、Blusam 儲存體中，甚至由內嵌串流定義、串連數個資料集，或產生 GDG。

使用 withFileConfiguration 方法來建置邏輯到資料集的實體映射，並將其提供給呼叫的程式。

## 撰寫您自己的程式
<a name="ba-shared-structure-write"></a>

為指令碼或其他現代化程式撰寫自己的程式來呼叫 是常見的任務。一般而言，在現代化專案中，當可執行式舊版程式以現代化程序不支援的語言撰寫，或來源已遺失 （是，可能會發生這種情況），或程式是無法使用來源的公用程式時，您會撰寫自己的程式。

在這種情況下，您可能必須自行在 Java 中撰寫缺少的程式 （假設您對程式預期的行為、程式引數的記憶體配置有的話，以此類推）。您的 Java 程式必須符合本文件所述的程式機制，以便其他程式和指令碼可以執行它。

若要確保程式可供使用，您必須完成兩個必要步驟：
+ 撰寫可正確實作`Program`界面的類別，以便進行註冊和呼叫。
+ 請確定您的程式已正確註冊，以便從其他程式/指令碼中可見。

### 撰寫程式實作
<a name="ba-shared-structure-write-implementation"></a>

使用您的 IDE 來建立新的 Java 類別，以實作`Program`界面：

![\[建立新的 Java 計劃類別\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/new_program.png)


下圖顯示 Eclipse IDE，負責建立要實作的所有強制性方法：

![\[建立新的 Java 程式類別 - 編輯來源\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/new_program_ide.png)


### 彈簧整合
<a name="ba-shared-structure-write-spring"></a>

首先，必須將 類別宣告為 Spring 元件。使用 註釋來註釋 類別`@Component`：

![\[使用 spring @Component 註釋\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/program_component.png)


接著，正確實作所需的方法。在此範例內容中，我們將 `MyUtilityProgram` 新增至已包含所有現代化程式的套件。該置放允許程式使用現有的 Springboot 應用程式來提供 getSpringApplication 方法實作`ConfigurableApplicationContext`所需的 ：

![\[實作 getSpringApplication 方法。\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/getSpringApplication.png)


您可以為自己的程式選擇不同的位置。例如，您可以在另一個專用服務專案中找到指定的程式。確定指定的服務專案有自己的 Springboot 應用程式，這可讓您擷取 ApplicationContext （應該是 `ConfigurableApplicationContext`)。

### 將身分提供給程式
<a name="ba-shared-structure-write-identity"></a>

若要讓其他程式和指令碼呼叫，程式必須至少提供一個識別符，這不得與系統中任何其他現有的已註冊程式衝突。識別符選擇可能是由需要涵蓋現有舊版程式取代所驅動；在這種情況下，您必須使用預期的識別符，如同在舊版程式中發現的 CALL 出現次數一樣。在舊版系統中，大多數的程式識別符長度為 8 個字元。

在程式中建立一組無法修改的識別符是執行此操作的一種方式。下列範例顯示選擇「MYUTILPG」作為單一識別符：

![\[程式識別符範例\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/program_identifier.png)


### 將程式與內容建立關聯
<a name="ba-shared-structure-write-context"></a>

程式需要配套`RuntimeContext`執行個體。對於現代化程式，適用於大型主機的 AWS Transform 會使用屬於舊版程式的資料結構，自動產生配套內容。

如果您要撰寫自己的程式，您也必須撰寫配套內容。

參考 [程式相關類別](#ba-shared-structure-org-entities-program)，您可以看到程式至少需要兩個配套類別：
+ 組態類別。
+ 使用 組態的內容類別。

如果公用程式程式使用任何額外的資料結構，則應一併寫入並供內容使用。

這些類別應位於套件中，該套件包含在應用程式啟動時掃描的套件階層中，以確保內容元件和組態將由 Spring 架構處理。

讓我們在`base package.myutilityprogram.business.context`套件中撰寫在實體專案中新建立的最小組態和內容：

![\[新公用程式的新專用組態和內容\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/new_program_context_package.png)


以下是組態內容。它使用的組態組建類似於附近的其他 -- 現代化 -- 程式。您可能必須根據您的特定需求自訂此項目。

![\[新的程式組態\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/new_program_configuration.png)


備註：
+ 一般命名慣例是 *ProgramName* Configuration。
+ 它必須使用 @org.springframework.context.annotation.Configuration 和 @Lazy 註釋。
+ Bean 名稱通常遵循 *ProgramName* ContextConfiguration慣例，但這並非強制性。請務必避免整個專案發生 Bean 名稱衝突。
+ 要實作的單一方法必須傳回`Configuration`物件。使用`ConfigurationBuilder`流暢的 API 來協助您建置。

以及相關聯的內容：

![\[Java 檔案中的新程式內容。\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/new_program_context.png)


備註
+ 內容類別應延伸現有的`Context`界面實作 ( `RuntimeContext`或 `JicsRuntimeContext`，這是`RuntimeContext`使用 JICS 特定項目增強的 )。
+ 一般命名慣例為 *ProgramName* Context。
+ 您必須將其宣告為原型元件，並使用 @Lazy 註釋。
+ 建構函數是指相關聯的組態，使用 @Qualifier 註釋以適當的組態類別為目標。
+ 如果公用程式程式使用一些額外的資料結構，它們應該是：
  + 寫入並新增至`base package.business.model`套件。
  + 內容中參考的 。查看其他現有的內容類別，了解如何參考資料細分類別，並視需要調整內容方法 （建構函式/清除/重設）。

現在有可用的專用內容，讓新程式使用它：

![\[新程式使用新建立的內容。\]](http://docs.aws.amazon.com/zh_tw/m2/latest/userguide/images/new_program_uses_context.png)


備註：
+ getContext 方法必須嚴格實作，如下所示，使用委派至 `ProgramContextStore`類別的 getOrCreate 方法和自動有線 Spring `BeanFactory`。單一程式識別符用於在 中存放程式內容`ProgramContextStore`；此識別符被參考為「程式主要識別符」。
+ 必須使用`@Import`彈簧註釋參考配套組態和內容類別。

### 實作商業邏輯
<a name="ba-shared-structure-write-business-logic"></a>

當程式骨架完成時，請實作新公用程式的商業邏輯。

在程式的 `run`方法中執行此操作。此方法會在呼叫程式時執行，無論是透過其他程式或指令碼。

編碼愉快！

### 處理程式註冊
<a name="ba-shared-structure-write-registration"></a>

最後，請確定新的程式已在 中正確註冊`ProgramRegistry`。如果您已將新程式新增至已包含其他程式的套件，則無需再執行任何操作。新程式會在應用程式啟動時取得並註冊其所有鄰近程式。

如果您為程式選擇其他位置，則必須確保程式已在 Tomcat 啟動時正確註冊。如需有關如何執行此操作的一些啟發，請查看服務專案中產生之 SpringbootLauncher 類別的初始化方法 （請參閱[服務專案內容](#ba-shared-structure-org-service))。

檢查 Tomcat 啟動日誌。每個程式註冊都會記錄。如果您的程式已成功註冊，您會找到相符的日誌項目。

當您確定您的程式已正確註冊時，您可以開始反覆運算商業邏輯編碼。

## 完整名稱映射
<a name="ba-shared-structure-fqn"></a>

本節包含大型主機 AWS 轉換的清單，以及用於現代化應用程式的第三方完整名稱映射。

### AWS 大型主機完整名稱映射的轉換
<a name="ba-shared-structure-fqn-table"></a>


| 短名稱 | 完整名稱 | 
| --- | --- | 
|  `CallBuilder`  |  `com.netfective.bluage.gapwalk.runtime.statements.CallBuilder`  | 
|  `Configuration`  |  `com.netfective.bluage.gapwalk.datasimplifier.configuration.Configuration`  | 
|  `ConfigurationBuilder`  |  `com.netfective.bluage.gapwalk.datasimplifier.configuration.ConfigurationBuilder`  | 
|  `ExecutionController`  |  `com.netfective.bluage.gapwalk.rt.call.ExecutionController`  | 
|  `ExecutionControllerImpl`  |  `com.netfective.bluage.gapwalk.rt.call.internal.ExecutionControllerImpl`  | 
|  `File`  |  `com.netfective.bluage.gapwalk.rt.io.File`  | 
|  `MainProgramRunner`  |  `com.netfective.bluage.gapwalk.rt.call.MainProgramRunner`  | 
|  `Program`  |  `com.netfective.bluage.gapwalk.rt.provider.Program`  | 
|  `ProgramContextStore`  |  `com.netfective.bluage.gapwalk.rt.context.ProgramContextStore`  | 
|  `ProgramRegistry`  |  `com.netfective.bluage.gapwalk.rt.provider.ProgramRegistry`  | 
|  `Record`  |  `com.netfective.bluage.gapwalk.datasimplifier.data.Record`  | 
|  `RecordEntity`  |  `com.netfective.bluage.gapwalk.datasimplifier.entity.RecordEntity`  | 
|  `RuntimeContext`  |  `com.netfective.bluage.gapwalk.rt.context.RuntimeContext`  | 
|  `SimpleStateMachineController`  |  `com.netfective.bluage.gapwalk.rt.statemachine.SimpleStateMachineController`  | 
|  `StateMachineController`  |  `com.netfective.bluage.gapwalk.rt.statemachine.StateMachineController`  | 
|  `StateMachineRunner`  |  `com.netfective.bluage.gapwalk.rt.statemachine.StateMachineRunner`  | 

### 第三方完整名稱映射
<a name="ba-shared-structure-3pfqn-table"></a>


| 短名稱 | 完整名稱 | 
| --- | --- | 
|  `@Autowired`  |  `org.springframework.beans.factory.annotation.Autowired`  | 
|  `@Bean`  |  `org.springframework.context.annotation.Bean`  | 
|  `BeanFactory`  |  `org.springframework.beans.factory.BeanFactory`  | 
|  `@Component`  |  `org.springframework.stereotype.Component`  | 
|  `ConfigurableApplicationContext`  |  `org.springframework.context.ConfigurableApplicationContext`  | 
|  `@Import`  |  `org.springframework.context.annotation.Import`  | 
|  `@Lazy`  |  `org.springframework.context.annotation.Lazy`  | 