我正在尝试列出并停止状态机的所有执行。我正在使用以下代码来列出并停止执行。
func stopAllExecutions(sfnSvc *sfn.SFN, stateMachineArn string) error {
var nextToken *string
// Since ListExecutionsInput only supports up to 1000 results per query, create loop to delete all executions
for {
executionsInput := &sfn.ListExecutionsInput{
StateMachineArn: aws.String(stateMachineArn),
MaxResults: aws.Int64(1000),
NextToken: nextToken,
StatusFilter: aws.String("RUNNING"),
}
executions, err := sfnSvc.ListExecutions(executionsInput)
if err != nil {return err}
for _, execution := range executions.Executions {
if *execution.Status == "RUNNING" {
_, err := sfnSvc.StopExecution(&sfn.StopExecutionInput{
ExecutionArn: execution.ExecutionArn,
})
if err != nil {
return err
}
}
}
// If NextToken is not set, there are no more results to retrieve
if executions.NextToken == nil {
break
}
nextToken = executions.NextToken
}
return nil
}
它将列出执行情况,说它们已被删除。如果我立即再次运行它,那么它应该没有执行。 AWS 控制台也显示没有执行。但是如果我运行
aws cli
命令:aws stepfunctions list-executions --state-machine-arn $STATE_MACHINE_ARN --status-filter RUNNING --output text
,它将显示我仍然有数千个执行处于 RUNNING
状态。
然后最奇怪的部分是,如果我等待一段时间(> 30 分钟),那么我的 golang 命令将能够再次看到执行并“终止”,而它只是表现得像以前一样,并且实际上并没有删除它们(就术语而言)
aws cli
命令可以看到的内容)
知道为什么会出现这种情况吗?
看起来是由于这一行:
*execution.Status == "RUNNING"
执行状态应该是指针(类型为aws.String)而不是字符串。该行将其与普通字符串进行比较,这导致该函数永远不会真正停止执行。然而,为什么操作后控制台没有显示执行结果仍然是个谜……