4

GoのGoogleAppEngineでのurlfetchのタイムアウトに問題があります。アプリは、約5秒より長いタイムアウトを取りたくないようです(長いタイムアウトを無視し、独自の時間の後にタイムアウトします)。

私のコードは次のとおりです。

var TimeoutDuration time.Duration = time.Second*30

func Call(c appengine.Context, address string, allowInvalidServerCertificate bool, method string, id interface{}, params []interface{})(map[string]interface{}, error){
    data, err := json.Marshal(map[string]interface{}{
        "method": method,
        "id":     id,
        "params": params,
    })
    if err != nil {
        return nil, err
    }

    req, err:=http.NewRequest("POST", address, strings.NewReader(string(data)))
    if err!=nil{
        return nil, err
    }

    tr := &urlfetch.Transport{Context: c, Deadline: TimeoutDuration, AllowInvalidServerCertificate: allowInvalidServerCertificate}

    resp, err:=tr.RoundTrip(req)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return nil, err
    }
    result := make(map[string]interface{})
    err = json.Unmarshal(body, &result)
    if err != nil {
        return nil, err
    }
    return result, nil
}

何に設定しようとしてTimeoutDurationも、アプリは約5秒後にタイムアウトになります。それを防ぐにはどうすればよいですか?コードにエラーがありましたか?

4

5 に答える 5

13

このように期間を渡す必要があります(そうしないと、デフォルトで5秒のタイムアウトになります)。

tr := &urlfetch.Transport{Context: c, Deadline: time.Duration(30) * time.Second}

2016年1月2日更新:

新しいGAEgolangパッケージ(google.golang.org/appengine/*)では、これが変更されました。urlfetchトランスポートで期限期間を受け取らなくなりました。

ここで、新しいコンテキストパッケージを介してタイムアウトを設定する必要があります。たとえば、これは1分の期限を設定する方法です。

func someFunc(ctx context.Context) {
    ctx_with_deadline, _ := context.WithTimeout(ctx, 1*time.Minute)
    client := &http.Client{
        Transport: &oauth2.Transport{
            Base:   &urlfetch.Transport{Context: ctx_with_deadline},
        },
    }
于 2014-10-20T18:24:17.520 に答える
3

以下のコードを試してください。

// createClient is urlfetch.Client with Deadline
func createClient(context appengine.Context, t time.Duration) *http.Client {
    return &http.Client{
        Transport: &urlfetch.Transport{
            Context:  context,
            Deadline: t,
        },
    }
}

使い方はこちらです。

// urlfetch
client := createClient(c, time.Second*60)

礼儀@gosharplite

于 2015-03-13T10:11:23.587 に答える
2

Goのappengineのソースコードを見てください。

およびprotobufferで生成されたコード:

期間自体に問題はないようです。

私の推測では、appengine内のアプリケーション全体が5秒後にタイムアウトします。

于 2012-11-15T18:53:26.337 に答える
2

私にとって、これはうまくいきました:

ctx_with_deadline, _ := context.WithTimeout(ctx, 15*time.Second)
client := urlfetch.Client(ctx_with_deadline)
于 2017-02-06T14:22:38.233 に答える
1

これは、ライブラリの最近の更新で変更されました。これで、タイムアウト/遅延の期間はコンテキストによって実行されるurlfetch.transport必要があり、Deadlineフィールドが含まれなくなりました。context.WithTimeoutまたはcontext.WithDeadline使用する方法です。ここにリンクhttps://godoc.org/golang.org/x/net/context#WithTimeoutがあります

于 2015-09-22T12:03:05.587 に答える