共用方式為


RunToCompletion

從 7.1 版開始,Service Fabric 可針對容器來賓可執行檔應用程式支援 RunToCompletion 語意。 這些語意可啟用會在完成工作後結束的應用程式和服務,而非一直執行的應用程式和服務。

繼續本文之前,建議您先熟悉 Service Fabric 應用程式模型Service Fabric 主控模型

注意

使用 Reliable Services 程式設計模型的服務不支援 RunToCompletion 語意。

RunToCompletion 語意和規格

當您匯入 ServiceManifest 時,您可以將 RunToCompletion 語意指定為 ExecutionPolicy。 組成 ServiceManifest 的 CodePackage 都會繼承指定的原則。 下列來自 ApplicationManifest.xml 的程式碼片段會提供範例:

<ServiceManifestImport>
  <ServiceManifestRef ServiceManifestName="RunToCompletionServicePackage" ServiceManifestVersion="1.0"/>
  <Policies>
    <ExecutionPolicy Type="RunToCompletion" Restart="OnFailure"/>
  </Policies>
</ServiceManifestImport>

ExecutionPolicy 允許兩個屬性:

  • Type 具有 RunToCompletion 作為唯一允許的值。

  • Restart 會指定在失敗時套用至 ServicePackage 中 CodePackage 的重新啟動原則。 以非零結束代碼結束的 CodePackage 會被視為失敗。 此屬性允許的值為 OnFailureNever,使用 OnFailure 作為預設值。

    • 將重新啟動原則設定為 OnFailure 時,任何因非零結束代碼而失敗的 CodePackage 會重新啟動,且重複失敗之間會停止。

    • 將重新啟動原則設定為 Never 時,如果有任何 CodePackage 失敗,DeployedServicePackage 的部署狀態就會標示為 [失敗],但其他 CodePackage 可以繼續執行。

如果 ServicePackage 中的所有 CodePackage 都成功執行完成且結束代碼為 0,則 DeployedServicePackage 的部署狀態會標示為 RanToCompletion

使用 RunToCompletion 語意的程式碼範例

我們來看一下使用 RunToCompletion 語意的完整範例。

重要

下列範例假設您熟悉使用 Service Fabric 和 Docker 建立 Windows 容器應用程式

Windows Server 容器在主機 OS 的所有版本之間不相容。 此範例參考 mcr.microsoft.com/windows/nanoserver:1809。 如需詳細資訊,請參閱 Windows 容器版本相容性

下列 ServiceManifest.xml 描述由代表容器的兩個 CodePackage 所組成的 ServicePackage。 RunToCompletionCodePackage1 只會將訊息記錄到 stdout 並結束。 RunToCompletionCodePackage2 會 ping 回送位址一段時間,然後以 012 的結束代碼結束。

<?xml version="1.0" encoding="UTF-8"?>
<ServiceManifest Name="WindowsRunToCompletionServicePackage" Version="1.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Description>Windows RunToCompletion Service</Description>
  <ServiceTypes>
    <StatelessServiceType ServiceTypeName="WindowsRunToCompletionServiceType"  UseImplicitHost="true"/>
  </ServiceTypes>
  <CodePackage Name="RunToCompletionCodePackage1" Version="1.0">
    <EntryPoint>
      <ContainerHost>
        <ImageName>mcr.microsoft.com/windows/nanoserver:1809</ImageName>
        <Commands>/c,echo Hi from RunToCompletionCodePackage1 &amp;&amp; exit 0</Commands>
        <EntryPoint>cmd</EntryPoint>
      </ContainerHost>
    </EntryPoint>
  </CodePackage>

  <CodePackage Name="RunToCompletionCodePackage2" Version="1.0">
    <EntryPoint>
      <ContainerHost>
        <ImageName>mcr.microsoft.com/windows/nanoserver:1809</ImageName>
        <Commands>/v,/c,ping 127.0.0.1 &amp;&amp; set /a exitCode=%random% % 3 &amp;&amp; exit !exitCode!</Commands>
        <EntryPoint>cmd</EntryPoint>
      </ContainerHost>
    </EntryPoint>
  </CodePackage>
</ServiceManifest>

下列 ApplicationManifest.xml 會根據上面所述的 ServiceManifest.xml 來描述應用程式。 此程式碼會將 WindowsRunToCompletionServicePackage 的 RunToCompletion ExecutionPolicy 重新啟動原則指定為 OnFailure

WindowsRunToCompletionServicePackage 啟用時,將會啟動其包含的 CodePackage。 RunToCompletionCodePackage1 應該在第一次啟用時成功結束。 RunToCompletionCodePackage2 可能會因為非零結束代碼而失敗,而且會重新啟動,因為重新啟動原則為 OnFailure

<?xml version="1.0" encoding="UTF-8"?>
<ApplicationManifest ApplicationTypeName="WindowsRunToCompletionApplicationType" ApplicationTypeVersion="1.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <Description>Windows RunToCompletion Application</Description>

  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="WindowsRunToCompletionServicePackage" ServiceManifestVersion="1.0"/>
    <Policies>
      <ExecutionPolicy Type="RunToCompletion" Restart="OnFailure"/>
    </Policies>
  </ServiceManifestImport>

  <DefaultServices>
    <Service Name="WindowsRunToCompletionService" ServicePackageActivationMode="ExclusiveProcess">
      <StatelessService ServiceTypeName="WindowsRunToCompletionServiceType" InstanceCount="1">
        <SingletonPartition />
      </StatelessService>
    </Service>
  </DefaultServices>
</ApplicationManifest>

查詢 DeployedServicePackage 的部署狀態

您可以查詢 DeployedServicePackage 的部署狀態。

RunToCompletion 語意的考量事項

請考慮有關 RunToCompletion 支援的下列幾點:

  • 容器來賓可執行檔應用程式可支援 RunToCompletion 語意。
  • 使用 RunToCompletion 語意的應用程式不允許有升級案例。 若有需要,您必須刪除並重新建立這類應用程式。
  • 容錯移轉事件可能會導致 CodePackage 在成功完成後,於相同節點或叢集的其他節點上重新執行。 容錯移轉事件的範例包括節點重新啟動,以及節點上的 Service Fabric 執行階段升級。
  • RunToCompletion 與 ServicePackageActivationMode="SharedProcess" 不相容。 Service Fabric 執行階段 9.0 版本與更新版本無法驗證這類服務。 SharedProcess 是預設值,因此您必須指定 ServicePackageActivationMode="ExclusiveProcess" 使用 RunToCompletion 語意。

下一步