2013-11-04 24 views
5

我有一個應用程序與幾個模塊。 dispatch.yaml文件將所有*/api/*呼叫從我的default模塊路由到我的server模塊。如何在不同的模塊上執行App Engine Go SDK延遲包?

下請求鏈發生:

  1. http://myapp.appspot.com/api/webrequest - 請注意,我們是默認的模塊上。
  2. http://server-dot-myapp.appspot.com/api/webrequest - 使用dispatch.yaml重定向到服務器模塊,其中appengine.delay.Call使用delay package製造。
  3. http://myapp.appspot.com/_ah/queue/go/delay - appengine.delay.Func被調用的默認模塊,而不是http://server-dot-myapp.appspot.com/_ah/queue/go/delay像我所期望的。

我該如何讓我的appengine.delay.Func執行http://server-dot-myapp.appspot.com/_ah/queue/go/delay

請注意,如果我直接撥打http://server-dot-myapp.appspot.com/api/webrequest而不使用dispatch.yaml重定向,則一切如預期,appengine.delay.Func被調用http://server-dot-myapp.appspot.com/_ah/queue/go/delay

回答

2

這是由於App Engine中的不協調。有關更多信息,請參閱Google Groups討論。

本質,而不是使用appengine.delay.Call您使用appengine.delay.Task並設置Host參數去你想要的模塊主機名:

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) 
+0

這不是一個錯誤。 'appengine/delay'軟件包就其本質而言是一種便利包。 「調用」方法的目標是默認模塊的任務,因爲這是大多數人想要的;正如您所見,您可以使用「任務」方法更好地控制發送的位置。 – dsymonds

+0

@dsymonds我可能會同意,在appengine/delay中沒有bug - 你會知道的。然而,我發現Call方法的目標是非默認模塊,如果它是由非默認模塊上的請求處理程序執行的,也是不一致的。但是,如果通過已經通過dispatch.yaml的請求調用了相同的請求處理程序,那麼Call方法將以默認模塊爲目標,即使它也在非默認模塊上執行。這必須是一個錯誤/監督? – Dan

+0

一般來說,taskqueue是如何工作的,這是'appengine/delay'構建的。我同意這有點出乎意料,但我認爲這是不能改變現在不打破一些應用程序的東西。 – dsymonds