К сожалению, вы не можете динамически указать время ожидания для состояния, но вы можете динамически определить состояние ожидания, как долго оно должно ждать. С учетом сказанного я бы порекомендовал вам использовать параллельное состояние с двумя ветвями и блоком перехвата. Первая ветвь содержит состояние ожидания и состояние отказа (ваше время ожидания). Другая ветвь содержит вашу обычную логику конечного автомата и состояние отказа.
Всякий раз, когда ветка выходит из строя в параллельном состоянии, она отменяет все запущенные состояния в других ветвях. К счастью, вы можете перехватить эти ошибки в параллельном состоянии и перенаправить их в другое состояние, в зависимости от того, какая ветвь не удалась. Вот пример того, что я имею в виду (измените значения в состоянии HardCodedInputs, чтобы указать, какая ветвь не работает).
{
"StartAt": "HardCodedInputs",
"States": {
"HardCodedInputs": {
"Type": "Pass",
"Parameters": {
"WaitBranchInput": {
"timeout": 5,
"Comment": "Change the value of timeout"
},
"WorkerBranchInput": {
"SecondsPath": 3,
"Comment": "SecondsPath is used for testing purposes to simulate how long the worker will run"
}
},
"Next": "Parallel"
},
"Parallel": {
"Type": "Parallel",
"End": true,
"Catch": [{
"ErrorEquals": ["TimeoutExpired"],
"ResultPath": "$.ParralelStateOutput",
"Next": "ExecuteIfTimedOut"
}, {
"ErrorEquals": ["WorkerSuccess"],
"ResultPath": "$.ParralelStateOutput",
"Next": "ExecuteIfWorkerSuccesfull"
}],
"Branches": [{
"StartAt": "DynamicTimeout",
"States": {
"DynamicTimeout": {
"Type": "Wait",
"InputPath": "$.WaitBranchInput",
"SecondsPath": "$.timeout",
"Next": "TimeoutExpired"
},
"TimeoutExpired": {
"Type": "Fail",
"Cause": "TimeoutExceeded.",
"Error": "TimeoutExpired"
}
}
},
{
"StartAt": "WorkerState",
"States": {
"WorkerState": {
"Type": "Wait",
"InputPath": "$.WorkerBranchInput",
"SecondsPath": "$.SecondsPath",
"Next": "WorkerSuccessful"
},
"WorkerSuccessful": {
"Type": "Fail",
"Cause": "Throw Worker Success Exception",
"Error": "WorkerSuccess"
}
}
}
]
},
"ExecuteIfTimedOut": {
"Type": "Pass",
"End": true
},
"ExecuteIfWorkerSuccesfull": {
"Type": "Pass",
"End": true
}
}
}