本文將詳細介紹云工作流的Java SDK安裝步驟及調用示例。以Java
語言為例,本文將講解如何調用云工作流以創建流程接口、獲取流程相關信息接口,以及異步啟動流程執行的接口為例,并提供完整的集成步驟。
前提條件
調用阿里云OpenAPI通常需要設置訪問密鑰(AccessKey)。請確保已創建AccessKey。具體操作,請參見創建AccessKey。為了避免憑據泄露,常見的方案是將其寫入到環境變量中,更多安全方案請參見使用訪問憑據訪問阿里云OpenAPI最佳實踐。
環境要求
最低要求Java 8。
步驟一:引入SDK
阿里云SDK支持泛化與特化兩種方式調用OpenAPI,詳情參見泛化調用與特化調用,不同的調用方式需要引入的SDK也不同。
特化調用
您可以訪問OpenAPI門戶網站,搜索您需要的產品,查看產品支持的SDK語言及安裝方法,然后在您的項目中引入SDK。本案例的SDK獲取步驟如下:
訪問云工作流 SDK。
在所有語言欄目中選擇您需要的SDK語言。
選擇您需要的安裝方式,將代碼復制到您的項目中。
在您的項目中載入該依賴包。
其Java語言的Maven依賴配置文件如下:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>fnf20190315</artifactId>
<version>1.1.2</version>
</dependency>
泛化調用
泛化調用方式不依賴任何一個產品的SDK,只依賴如下核心包com.aliyun.tea-openapi
。其Java語言Maven依賴安裝配置文件如下,最新版本請參見tea-openapi。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-openapi</artifactId>
<version>0.2.8</version>
</dependency>
步驟二:初始化Client
請根據云工作流(FNF)所屬地域正確填寫服務接入地址(又稱“訪問端點”或“Endpoint”),關于服務接入地址的更多信息,請參見支持的地域。
以下將以特化調用代碼為例,詳細說明調用過程。如您選擇泛化調用方案,更多信息請參見泛化調用與特化調用。
使用AK初始化
阿里云賬號AccessKey擁有所有OpenAPI的訪問權限,建議您使用RAM用戶進行API訪問或日常運維。強烈建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。
本示例以將AccessKey配置在環境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET的方式來實現身份驗證為例。
更多認證信息配置方式,請參見管理訪問憑據。
不同操作系統的環境變量配置方法不同,具體操作,請參見在Linux、macOS和Windows系統配置環境變量。
import com.aliyun.tea.*;
public class Sample {
/**
* <b>description</b> :
* <p>使用AK&SK初始化賬號Client</p>
* @return Client
* @throws Exception
*/
public static com.aliyun.fnf20190315.Client createClient() throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,請確保代碼運行環境設置了環境變量 ALIBABA_CLOUD_ACCESS_KEY_ID。
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// 必填,請確保代碼運行環境設置了環境變量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
config.endpoint = "cn-hangzhou.fnf.aliyuncs.com";
return new com.aliyun.fnf20190315.Client(config);
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
com.aliyun.fnf20190315.Client client = Sample.createClient();
}
}
步驟三:使用已初始化的Client調用云工作流(FNF) API
初始化Client后,您可以通過Client調用云工作流API。
接口名稱:CreateFlow
此接口用于創建一個流程。在調用過程中,您需要根據實際業務需求創建請求對象,并設置相應的參數及運行時配置。同時,您也可以自定義運行時配置以滿足特定需求。
// 創建請求對象
com.aliyun.fnf20190315.models.CreateFlowRequest createFlowRequest = new com.aliyun.fnf20190315.models.CreateFlowRequest()
// 您的流程名稱
.setName("your_flow_name")
// 流程定義,遵循 Flow Definition Language (FDL)語法標準??紤]到向前兼容,當系統支持兩種規范的流程定義規范。
.setDefinition("舊版:
\"
type: flow
version: v1
name: my_flow_name
steps:
- type: pass
name: mypass
\"
新版:
\"
Type: StateMachine
SpecVersion: v1
Name: my_flow_name
StartAt: my_state
States:
- Type: Pass
Name: my_state
End: true
\"")
// 流程描述
.setDescription("my test flow")
// 流程類型
.setType("FDL");
// 運行時配置
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
以下是使用AK創建一個流程的完整示例代碼:
package com.aliyun.sample;
import com.aliyun.tea.*;
public class Sample {
/**
* <b>description</b> :
* <p>使用AK&SK初始化賬號Client</p>
* @return Client
*
* @throws Exception
*/
public static com.aliyun.fnf20190315.Client createClient() throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,請確保代碼運行環境設置了環境變量 ALIBABA_CLOUD_ACCESS_KEY_ID。
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// 必填,請確保代碼運行環境設置了環境變量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
config.endpoint = "cn-hangzhou.fnf.aliyuncs.com";
return new com.aliyun.fnf20190315.Client(config);
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
com.aliyun.fnf20190315.Client client = Sample.createClient();
// 創建請求對象
com.aliyun.fnf20190315.models.CreateFlowRequest createFlowRequest = new com.aliyun.fnf20190315.models.CreateFlowRequest()
// 您的流程名稱
.setName("your_flow_name")
// 流程定義,遵循 Flow Definition Language (FDL)語法標準??紤]到向前兼容,當系統支持兩種規范的流程定義規范。
.setDefinition("舊版:
\"
type: flow
version: v1
name: my_flow_name
steps:
- type: pass
name: mypass
\"
新版:
\"
Type: StateMachine
SpecVersion: v1
Name: my_flow_name
StartAt: my_state
States:
- Type: Pass
Name: my_state
End: true
\"")
// 流程描述
.setDescription("my test flow")
// 流程類型
.setType("FDL");
// 運行時配置
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 復制代碼運行請自行打印 API 的返回值
client.createFlowWithOptions(createFlowRequest, runtime);
} catch (TeaException error) {
// 此處僅做打印展示,請謹慎對待異常處理,在工程項目中切勿直接忽略異常。
// 錯誤 message
System.out.println(error.getMessage());
// 診斷地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此處僅做打印展示,請謹慎對待異常處理,在工程項目中切勿直接忽略異常。
// 錯誤 message
System.out.println(error.getMessage());
// 診斷地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}
接口名稱:DescribeFlow
此接口用于獲取特定流程的相關信息。在調用過程中,您需要根據實際業務需求創建請求對象,并設置相應的參數及運行時配置。同時,您也可以自定義運行時配置以滿足特定需求。
// 創建請求對象
com.aliyun.fnf20190315.models.DescribeFlowRequest describeFlowRequest = new com.aliyun.fnf20190315.models.DescribeFlowRequest()
// 您的流程名稱
.setName("your_flow_name");
// 運行時配置
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
以下是使用AK獲取流程相關信息的完整示例代碼:
package com.aliyun.sample;
import com.aliyun.tea.*;
public class Sample {
/**
* <b>description</b> :
* <p>使用AK&SK初始化賬號Client</p>
* @return Client
*
* @throws Exception
*/
public static com.aliyun.fnf20190315.Client createClient() throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,請確保代碼運行環境設置了環境變量 ALIBABA_CLOUD_ACCESS_KEY_ID。
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// 必填,請確保代碼運行環境設置了環境變量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
config.endpoint = "cn-hangzhou.fnf.aliyuncs.com";
return new com.aliyun.fnf20190315.Client(config);
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
com.aliyun.fnf20190315.Client client = Sample.createClient();
// 創建請求對象
com.aliyun.fnf20190315.models.DescribeFlowRequest describeFlowRequest = new com.aliyun.fnf20190315.models.DescribeFlowRequest()
// 請求參數
.setName("your_flow_name");
// 運行時配置
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 復制代碼運行請自行打印 API 的返回值
client.describeFlowWithOptions(describeFlowRequest, runtime);
} catch (TeaException error) {
// 此處僅做打印展示,請謹慎對待異常處理,在工程項目中切勿直接忽略異常。
// 錯誤 message
System.out.println(error.getMessage());
// 診斷地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此處僅做打印展示,請謹慎對待異常處理,在工程項目中切勿直接忽略異常。
// 錯誤 message
System.out.println(error.getMessage());
// 診斷地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}
接口名稱:StartExecution
此接口用于異步調用以啟動一個流程的執行。在調用過程中,您需要根據實際業務需求構建請求對象,并設置相應的參數及運行時配置。同時,您也可以自定義運行時配置以滿足特定需求。
// 創建請求對象
com.aliyun.fnf20190315.models.StartExecutionRequest startExecutionRequest = new com.aliyun.fnf20190315.models.StartExecutionRequest()
// 您的開始執行的流程名稱
.setFlowName("your_flow_name")
// 執行名稱
.setExecutionName("your_exec_name")
// 執行的輸入
.setInput("{\"key\":\"value\"}")
// 流程執行結束后回調TaskToken相關任務
.setCallbackFnFTaskToken("12");
// 運行時配置
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
以下是使用AK異步調用啟動一個流程的執行的完整示例代碼:
package com.aliyun.sample;
import com.aliyun.tea.*;
public class Sample {
/**
* <b>description</b> :
* <p>使用AK&SK初始化賬號Client</p>
* @return Client
*
* @throws Exception
*/
public static com.aliyun.fnf20190315.Client createClient() throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,請確保代碼運行環境設置了環境變量 ALIBABA_CLOUD_ACCESS_KEY_ID。
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// 必填,請確保代碼運行環境設置了環境變量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
config.endpoint = "cn-hangzhou.fnf.aliyuncs.com";
return new com.aliyun.fnf20190315.Client(config);
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
com.aliyun.fnf20190315.Client client = Sample.createClient();
// 創建請求對象
com.aliyun.fnf20190315.models.StartExecutionRequest startExecutionRequest = new com.aliyun.fnf20190315.models.StartExecutionRequest()
// 您的開始執行的流程名稱
.setFlowName("your_flow_name")
// 執行名稱
.setExecutionName("your_exec_name")
// 執行的輸入
.setInput("{\"key\":\"value\"}")
// 流程執行結束后回調TaskToken相關任務
.setCallbackFnFTaskToken("12");
// 運行時配置
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 復制代碼運行請自行打印 API 的返回值
client.startExecutionWithOptions(startExecutionRequest, runtime);
} catch (TeaException error) {
// 此處僅做打印展示,請謹慎對待異常處理,在工程項目中切勿直接忽略異常。
// 錯誤 message
System.out.println(error.getMessage());
// 診斷地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此處僅做打印展示,請謹慎對待異常處理,在工程項目中切勿直接忽略異常。
// 錯誤 message
System.out.println(error.getMessage());
// 診斷地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}
SDK調用示例
您可以使用API級別的多語言SDK Demo進行調試。示例代碼,請參見開發者門戶OpenAPI Explorer。