您可以使用任务(Task)状态来调用集成服务API,完成复杂的工作流程。本文介绍任务状态的基本概念及其相关使用示例,指导您利用任务状态来调用集成服务API。
基本概念
任务(Task)状态主要用于调用其他集成服务API来完成特定任务。利用任务类型状态可以执行一个函数调用,调用阿里云服务API,也可以通过HTTP/HTTPS等通用协议发起第三方服务调用。在流程定义语言中,我们通过声明State的类型为‘Task’标记当前状态是一个任务类型的状态。
任务状态包含以下属性。
| 字段 | 类型 | 是否必选 | 描述 | 示例值 | 
| Name | string | 是 | 状态名称。 | my-state-name | 
| Description | string | 否 | 状态描述。 | describe it here | 
| Type | string | 是 | 状态类型。 | Task | 
| Action | string | 是 | 用于定义工作流中每个任务要执行的具体动作。这通常是对应某个云服务产品的API名称,或者是集成服务的特定操作名称。遵循 <产品名>:<APIName>。 | FC:InvokeFunction | 
| TaskMode | enum | 否 | 任务调用模式,云工作流提供3种任务类型,具体类型描述细节参考服务集成模式。 
 | WaitForCustomCallback | 
| InputConstructor | map[string]any | 否 | 输入构造器。 | 请参见输入和输出 | 
| Parameters | map[string]any | 否 | 请求调用参数规范;对应Action行为定义的具体调用参数规范。 可使用常量或JsonPath进行参数赋值。 | 参数规范请参见集成简介 | 
| Timeout | string | 否 | 调用最大超时时间,单位为秒。取值范围为[0,604800],为0表示Task永远不会超时。 | 30 | 
| 支持表达式构造,您可以根据上下文动态设置该值。 | Timeout.$: $Input.timeout | |||
| Retry | map[string]any | 否 | 错误重试策略配置。 | 请参见错误处理 | 
| Catch | map[string]any | 否 | 错误捕获策略配置。 | 请参见错误处理 | 
| OutputConstructor | map[string]any | 否 | 输出构造器。 | 请参见输出构造器 | 
| Next | string | 否 | 当前状态的下一个状态。当End取值为true时,无需指定。 | my-next-state | 
| End | bool | 否 | 是否为当前作用域的终结节点。 | true | 
调用示例
调用函数计算
通过声明Task类型的State,利用Parameters字段,按照函数计算调用参数规范,指定需要调用函数的信息,具体参数规范请参见配置调用参数。函数调用既可以通过优化集成方式调用,也可以直接使用对应的阿里云OpenAPI调用。
Type: StateMachine
Name: MyWorkflow
SpecVersion: v1
StartAt: 同步调用函数示例
States:
  - Name: 同步调用函数示例
    Type: Task
    TaskMode: RequestComplete
    Action: FC:InvokeFunction
    Parameters:
      resourceArn: acs:fc:::functions/myFunction1/LATEST
      invocationType: Sync
      body:
        key: name
    Next: 异步调用函数示例
  - Type: Task
    Name: 异步调用函数示例
    Action: FC:InvokeFunction
    TaskMode: RequestComplete
    Parameters:
      invocationType: Async
      resourceArn: acs:fc:{region}:{accountID}:functions/myFunction/LATEST
      body:
        key: name
    Next: SucceededExit
  - Type: Pass
    Name: SucceededExit
    End: true
调用阿里云服务API
按照阿里云OpenAPI规范,调用相应的OpenAPI。例如 ECS:DescribeInstances。
Type: StateMachine
SpecVersion: v1
Name: MyWorkflow
StartAt: DescribeInstances
States:
  - Type: Task
    Name: DescribeInstances
    Action: ECS:DescribeInstances
    TaskMode: RequestComplete
    Parameters:
      RegionId: cn-hangzhou
      VpcId: vpc-bp11y195luy47h8****
      VSwitchId: vsw-bp1wb297ekw7xyh****
    End: true
调用外部服务并配置Task超时以及Catch
该示例调用一个外部的HTTP服务,集成模式为WaitForCustomCallback,并为任务配置了1个小时的超时时间。如果任务在1小时内未能执行完成,则工作流将抛出错误,并被Catch配置的规则进行捕获。
Type: StateMachine
Name: MyWorkflow
SpecVersion: v1
StartAt: SubmitTask
States:
  - Type: Task
    Name: SubmitTask
    Action: HTTP:Request
    TaskMode: RequestComplete
    Timeout.$: $Input.timeout
    Parameters:
      method: POST
      url: https://*****
      body:
        taskName: fly
      headers:
        Content-Type: multipart/form-data
    Catch:
      - Errors:
          - FnF.TaskTimeout
        Description: '错误捕获规则 #1'
        Next: NotifyOnTaskTimeout
        OutputConstructor:
          ErrorCode: TaskTimeout
          ErrorMessage: Task timed out.
    End: true
  - Type: Task
    Name: NotifyOnTaskTimeout
    Action: HTTP:Request
    TaskMode: RequestComplete
    Parameters:
      method: POST
      url: https://******
      body:
        taskName: fly
        errorCode.$: $Input.ErrorCode
        errorMessage.$: $Input.ErrorMessage
      headers:
        Content-Type: multipart/form-data
    End: true
Task超时参数从执行输入中获取,可通过如下的输入发起执行:
{
  "timeout": 10
}如果Task未在规定时间内完成,则超时错误会被捕获,工作流会继续执行到NotifyOnTaskTimeout节点,发送一条Task执行超时的通知。
