1 回答

TA貢獻1785條經驗 獲得超4個贊
SDK已經提供了重試。
這是一個使用 aws-sdk-go-v2 的示例。
package main
import (
"context"
"fmt"
"time"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/athena"
"github.com/aws/aws-sdk-go-v2/service/athena/types"
)
func main() {
cfg := aws.NewConfig()
ath := athena.NewFromConfig(*cfg)
ctx, cancelFunc := context.WithTimeout(context.Background(), time.Minute*5)
defer cancelFunc()
rows, err := GetQueryResults(ctx, ath, aws.String("query-id"), 10)
if err != nil {
panic(err) // TODO: handle error
}
fmt.Println(rows)
}
func GetQueryResults(ctx context.Context, client *athena.Client, QueryID *string, attempts int) ([]types.Row, error) {
t := time.NewTicker(time.Second * 5)
defer t.Stop()
attemptsFunc := func(o *athena.Options) { o.RetryMaxAttempts = attempts }
WAIT:
for {
select {
case <-t.C:
out, err := client.GetQueryExecution(ctx, &athena.GetQueryExecutionInput{
QueryExecutionId: QueryID,
}, attemptsFunc)
if err != nil {
return nil, err
}
switch out.QueryExecution.Status.State {
case types.QueryExecutionStateCancelled,
types.QueryExecutionStateFailed,
types.QueryExecutionStateSucceeded:
break WAIT
}
case <-ctx.Done():
break WAIT
}
}
data, err := client.GetQueryResults(ctx, &athena.GetQueryResultsInput{
QueryExecutionId: QueryID,
})
if err != nil {
return nil, err
}
return data.ResultSet.Rows, nil
}
- 1 回答
- 0 關注
- 204 瀏覽
添加回答
舉報