我无法让appengine任务队列接受我向其抛出的任何上下文:
import (
"context"
"google.golang.org/appengine"
"google.golang.org/appengine/taskqueue"
)
/* snip */
ctx:= context.Background()
task := taskqueue.NewPOSTTask("/b/mytask", params)
_, err = taskqueue.Add(ctx, task, "")
if err != nil {
return fmt.Errorf("adding background task with path %s: %v", task.Path, err)
}
我正在go111 migration docs中声明的main.go主函数中调用appengine.Main()(但是go112 migration docs中缺少此行,因此我不确定是否需要)。
我尝试过:
context.Background()
request.Context()
appengine.NewContext(r)
appengine.BackgroundContext()
context.TODO()
所有结果均出错:
不是App Engine上下文
appengine.BackgroundContext()
除外:
服务桥HTTP失败:发布 http://appengine.googleapis.internal:10001/rpc_http:拨打tcp 169.254.169.253:10001:I / O超时
答案 0 :(得分:0)
将GAE标准项目从go19迁移到go112以便使用go模块时,我遇到了相同的问题。另外,我收到很多“ 502网关错误”消息。
用 appengine.Main()替换main()中的http.ListenAndServe()修复了上下文问题。移至 go111 而不是112可以解决其他问题。文档和示例对此并不十分清楚。
答案 1 :(得分:0)
documentation for migration to 1.12指出:
使用cloud Tasks使用cloudtasks软件包从Go 1.12中排队任务。您可以将任何App Engine服务用作App Engine任务的目标。
但是cloudtasks软件包文档(截至今天)为clearly marked as beta and unstable。因此,这里的答案可能是。不支持此功能。
也就是说,我在go111下的生产环境中使用了它,到目前为止没有发现任何严重的问题。
答案 2 :(得分:0)
您看到 internal.flushLog: Flush RPC: service bridge HTTP failed
是因为您在尝试运行 Go 1.12+ 运行时时有 appengine.Main()
或其他 appengine
库调用。 (我的猜测是,较旧的运行时必须调用一些 Google 内部的会计基础架构,而这不适用于 1.12“下一代”系统。)
解决方案不是降级你的 Go 版本——这样做你会错过大量的性能和安全改进,而且你无法利用新硬件——解决方案是删除所有调用到 appengine
库并改用 GCP 的云库(请参阅 https://godoc.org/cloud.google.com/go)