Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I execute App Engine Go SDK delay package on a different module?

I have an app with several modules. A dispatch.yaml file routes all */api/* calls from my default module to my server module.

The following request chain happens:

  1. http://myapp.appspot.com/api/webrequest - Note we are on the default module.
  2. http://server-dot-myapp.appspot.com/api/webrequest - Redirection with dispatch.yaml to the server module where appengine.delay.Call is made using the delay package.
  3. http://myapp.appspot.com/_ah/queue/go/delay - The appengine.delay.Func is called on the default module instead of http://server-dot-myapp.appspot.com/_ah/queue/go/delay like I would expect.

How can I make my appengine.delay.Func execute with http://server-dot-myapp.appspot.com/_ah/queue/go/delay?

Note that if I call http://server-dot-myapp.appspot.com/api/webrequest directly without using the dispatch.yaml redirect, everything workes as expected and appengine.delay.Func gets called with http://server-dot-myapp.appspot.com/_ah/queue/go/delay.

like image 850
Dan Avatar asked Oct 20 '22 21:10

Dan


1 Answers

This is due to an incongruity in App Engine. See Google Groups discussion for further information.

Essentially instead of using appengine.delay.Call you use appengine.delay.Task and set the Host param to the module host name you want:

t := myDelayFunc.Task("myparam")
t.Header = make(map[string][]string)

hostName, err := appengine.ModuleHostname(context, "[your module name]", "", "")
t.Header.Set("Host", hostName)
taskqueue.Add(context, t)
like image 148
Dan Avatar answered Oct 24 '22 00:10

Dan