2010-09-30 84 views
4

我正在使用任務(排隊任務)排隊多個其他任務 - 扇出。當我嘗試使用Queue.add,並且任務參數是具有多於5個元素的Task實例列表並且在事務中時...我得到此錯誤。任務扇出 - 如何批量添加任務到隊列 - 超過5

JointException: taskqueue.DatastoreError caused by: 
    <class 'google.appengine.api.datastore_errors.BadRequestError'> 
    Too many messages, maximum allowed 5 

是否有另一種方法來排隊超過5個任務的交易?

或者......

也許我並不需要一個事務,原因:如果排隊

  1. 如果任何這些任務被排隊兩次,反正我不在乎,和
  2. 將失敗,然後整個排隊任務將重新運行。

因此,告訴我如何排隊超過5個任務的交易或告訴我不使用交易的原因,我真的不需要一個。

回答

2

一個解決方案關閉來解決你的問題是添加一個事務性任務,扇出剩下的任務。只需在現有交易中添加一個扇出任務即可。

除非有商業邏輯理由這樣做,否則不要重新運行已經運行的任務。防止任務重新插入(即重複)很簡單,節省資源。你扇出任務基本上是這樣的:

class FanOutTask(webapp.RequestHandler): 
    def get(self): 
    name = self.request.get('name') 
    params = deserialize(self.request.get('params')) 

    try: 
     task_params = params.get('stuff') 
     taskqueue.add(url='/worker/1', name=name + '-1', params=task_params) 
    except TaskAlreadyExistsError: 
     pass 

    try: 
     task_params = params.get('more') 
     taskqueue.add(url='/worker/2', name=name + '-2', params=task_params) 
    except TaskAlreadyExistsError: 
     pass 

添加扇出任務的事務,確保其入隊。已經運行的任務導致的錯誤被捕獲並被忽略,其他錯誤會導致扇出任務重新運行。有了這個模式,你可以很容易地插入許多子任務。