本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Choice 工作流程状态
管理状态和转换数据
Choice 状态 ("Type": "Choice") 向状态机添加条件逻辑。
除了大多数常用状态字段之外,Choice 状态还包含以下额外字段。
Choices(必填)-
选项规则数组,确定状态机接下来转换为什么状态。您必须在
Choice状态中至少定义一条规则。运行
Choice状态时,Step Functions 会将每个 Choice Rule 评估为 true 或 false。根据评估结果,Step Functions 会转换到工作流中的下一个状态。 Default(可选,建议)-
如果没有任何 Choice Rule 的评估结果为 true,则为要过渡到的状态的名称。
重要
Choice 状态不支持 End 字段。此外,它们仅在其 Choices 字段内部使用 Next。
当工作流运行时,如果没有任何 Choice 表达式的结果为 true,且未提供 Default 分支,状态机将因无法从该状态转出而抛出错误。
Choice Rule(JSONata)
Choice 状态必须有一个值为非空 Choice Rule 数组的 Choices 字段,使用 JSONata 时,该数组包含以下字段:
-
Condition字段 — 一个 jsonata 表达式,其计算结果为。 true/false -
Next字段 — 此字段的值必须与状态机中的状态名称匹配。 -
Assign字段(可选)-当此特定选择规则匹配时分配变量。每个选择规则都可以有自己的Assign区块,允许您根据所走的路径设置不同的变量。您还可以在州级别指定一个Assign区块,无论哪个选择规则匹配,该区块都适用。
以下示例检查数值是否等于 1。
{
"Condition": "{% $foo = 1 %}",
"Next": "NumericMatchState"
}
以下示例检查 type 变量是否等于 local。
{
"Condition": "{% $type = 'local' %}",
"Next": "StringMatchState"
}
以下示例检查字符串是否大于 MyStringABC。
{
"Condition": "{% $foo > 'MyStringABC' %}",
"Next": "StringGreaterMatchState"
}
以下示例检查字符串是否为 null。
{
"Condition" : "{% $possiblyNullValue != null and $possiblyNullValue = 42 %}",
"Next": "NotNullAnd42"
}
以下示例显示了一种Choice状态,其每个规则Assign块根据匹配的条件设置不同的变量:
{
"Type": "Choice",
"Choices": [
{
"Condition": "{% $states.input.category = 'premium' %}",
"Next": "PremiumPath",
"Assign": {
"discount": 20
}
},
{
"Condition": "{% $states.input.category = 'standard' %}",
"Next": "StandardPath",
"Assign": {
"discount": 5
}
}
],
"Default": "DefaultPath",
"Assign": {
"discount": 0
}
}
使用 “按选择赋值” 状态
在 “选择” 状态下,您可以在两个级别上使用该Assign字段:
-
顶层 — 在任何选择规则之外直接在 “选择” 状态下定义。
-
在选择规则内部-在
Choices数组中的单个规则中定义。
这两个展示位置在运行时是相互排斥的。如果选择规则匹配,Step Functions 将仅评估该规则的Assign字段,而不计算顶级Assign字段。Assign只有当没有匹配的选择规则并且工作流程转换到Default状态时,Step Functions 才会评估顶层。
以下示例显示了两个展示位置。
{
"Type": "Choice",
"Assign": {
"outputValue": "{% 'default path taken' %}"
},
"Choices": [
{
"Condition": "{% $score > 90 %}",
"Assign": {
"outputValue": "{% 'high score' %}"
},
"Next": "HighScoreState"
},
{
"Condition": "{% $score > 50 %}",
"Next": "MediumScoreState"
}
],
"Default": "LowScoreState"
}
在此示例中,如果大$score于 90,Step Functions outputValue 将赋值给"high score"并转换为。HighScoreState不Assign对顶层进行评估。如果没有匹配的规则,Step Functions 将计算顶级规则Assign并转换为。LowScoreState
Choice Rule(JSONPath)
Choice 状态必须有一个值为非空 Choice Rule 数组的 Choices 字段,使用 JSONPath 时,该数组包含以下字段:
-
比较 – 两个字段,指定要比较的输入变量、比较的类型以及与变量进行比较的值。选项规则支持两个变量之间的比较。在选项规则中,通过在支持的比较运算符名称后附加
Path,可以将变量值与状态输入中的另一个值进行比较。比较中的Variable和路径字段的值必须是有效的参考路径。 -
Next字段 – 此字段的值必须与状态机中的状态名称匹配。
以下示例检查数值是否等于 1。
{
"Variable": "$.foo",
"NumericEquals": 1,
"Next": "FirstMatchState"
}
以下示例检查字符串是否等于 MyString。
{
"Variable": "$.foo",
"StringEquals": "MyString",
"Next": "FirstMatchState"
}
以下示例检查字符串是否大于 MyStringABC。
{
"Variable": "$.foo",
"StringGreaterThan": "MyStringABC",
"Next": "FirstMatchState"
}
以下示例检查字符串是否为空。
{
"Variable": "$.possiblyNullValue",
"IsNull": true
}
以下示例显示了由于前面的IsPresent选择 StringEquals 规则,只有在规则$.keyThatMightNotExist存在时才对规则进行评估。
"And": [
{
"Variable": "$.keyThatMightNotExist",
"IsPresent": true
},
{
"Variable": "$.keyThatMightNotExist",
"StringEquals": "foo"
}
]
以下示例检查带有通配符的模式是否匹配。
{ "Variable": "$.foo", "StringMatches": "log-*.txt" }
以下示例检查时间戳是否等于 2001-01-01T12:00:00Z。
{
"Variable": "$.foo",
"TimestampEquals": "2001-01-01T12:00:00Z",
"Next": "FirstMatchState"
}
以下示例将变量与状态输入中的另一个值进行比较。
{ "Variable": "$.foo", "StringEqualsPath": "$.bar" }
Step Functions 按照 Choices 字段中列出的顺序检查每个选项规则。然后,根据比较运算符确定变量与值匹配的第一条选项规则,并转换为该规则中的 Next 字段指定的状态。
支持下列比较运算符:
-
And -
BooleanEquals,BooleanEqualsPath -
IsBoolean -
IsNull -
IsNumeric -
IsPresent -
IsString -
IsTimestamp -
Not -
NumericEquals,NumericEqualsPath -
NumericGreaterThan,NumericGreaterThanPath -
NumericGreaterThanEquals,NumericGreaterThanEqualsPath -
NumericLessThan,NumericLessThanPath -
NumericLessThanEquals,NumericLessThanEqualsPath -
Or -
StringEquals,StringEqualsPath -
StringGreaterThan,StringGreaterThanPath -
StringGreaterThanEquals,StringGreaterThanEqualsPath -
StringLessThan,StringLessThanPath -
StringLessThanEquals,StringLessThanEqualsPath -
StringMatches -
TimestampEquals,TimestampEqualsPath -
TimestampGreaterThan,TimestampGreaterThanPath -
TimestampGreaterThanEquals,TimestampGreaterThanEqualsPath -
TimestampLessThan,TimestampLessThanPath -
TimestampLessThanEquals,TimestampLessThanEqualsPath
对于每个上述运算符,对应值必须为合适的类型:字符串、数字、布尔值或时间戳。Step Functions 不尝试将数值字段与字符串值匹配。但是,由于时间戳字段在逻辑上是字符串,视为时间戳的字段可能会由 StringEquals 运算符匹配。
注意
为了实现互操作性,请不要假定数值比较可用于超出 IEEE 754-2008 binary64 数据类型[-253+1,
253-1] 的整数可能会无法按预期方式比较。
时间戳 (例如,2016-08-18T17:33:00Z) 必须遵从 RFC3339 配置文件 ISO 8601
-
必须使用大写
T分隔日期和时间部分。 -
大写
Z必须表示没有数字时区偏移。
要了解字符串比较的行为,请参阅 Java compareTo 文档
And 和 Or 运算符的值必须为非空的选项规则数组,自身不能包含 Next 字段。与此类似,Not 运算符的值必须为单个选项规则,不能包含 Next 字段。
您可以使用 And、Not 和 Or 创建复杂的嵌套选项规则。但是,Next 字段只能显示在顶级选项规则中。
可以使用比较运算符与带有一个或多个通配符(“*”)的模式进行字符串 StringMatches 比较。通配符使用标准的 \\ (Ex: “\\*”) 对进行转义。在匹配过程中,除了“*”以外,其他字符没有任何特殊含义。