任务(Task)

您可以使用任务(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种任务类型,具体类型描述细节参考服务集成模式

  • RequestComplete

  • WaitForCustomCallback

  • WaitForSystemCallback

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执行超时的通知。

image