2014-10-30 92 views
2

我在taskqueue API中看到了一個bug行爲。當任務失敗時,即使我不告訴它,appengine也會再次運行它。即使task_retry_limit = 0,appengine也會運行失敗的任務兩次

這是相關代碼:

NO_RETRY = TaskRetryOptions(task_retry_limit=0) 


class EnqueueTaskDapau(webapp2.RequestHandler): 
    def get(self): 
     taskqueue.add(
      url='/task_dapau', 
      queue_name='DEFAULT', 
      retry_options=NO_RETRY 
     ) 


class TaskDapau(webapp2.RequestHandler): 
    def get(self): 
     logging.warning('Vai dar pau') 
     raise BaseException('Deu pau :-)') 

    def post(self): 
     return self.get() 


application = webapp2.WSGIApplication([ 
    ('/', MainPage), 
    ('/enqueue_dapau', EnqueueTaskDapau), 
    ('/task_dapau', TaskDapau), 
], debug=True) 

整個應用程序是available on Github所以它應該很容易重現。 當我指出我的瀏覽器/ enqueue_dapau,這是我在日誌中看到(在Web控制檯上):

2014-10-30 08:31:01.054 /task_dapau 500 4ms 0kb AppEngine-Google; (+http://code.google.com/appengine) module=default version=1 
W 2014-10-30 08:31:01.052 Vai dar pau 
E 2014-10-30 08:31:01.053 Traceback (most recent call last): File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 267, in 

2014-10-30 08:31:00.933 /task_dapau 500 3ms 0kb AppEngine-Google; (+http://code.google.com/appengine) module=default version=1 
W 2014-10-30 08:31:00.931 Vai dar pau 
E 2014-10-30 08:31:00.932 Traceback (most recent call last): File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 267, in 

2014-10-30 08:31:00.897 /enqueue_dapau 200 91ms 0kb Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36 module=default version=1 

如果我把任務隊列的Web控制檯上,我看到「運行在最後一分鐘== 2" 這種現象是從我與SDK本地得到不同:

INFO  2014-10-30 15:49:05,711 module.py:666] default: "GET /enqueue_dapau HTTP/1.1" 200 - 
WARNING 2014-10-30 15:49:05,729 views.py:33] Vai dar pau 
ERROR 2014-10-30 15:49:05,729 wsgi.py:279] 
Traceback (most recent call last): 
    File "/home/tony/google_appengine/google/appengine/runtime/wsgi.py", line 267, in Handle 
    result = handler(dict(self._environ), self._StartResponse) 
    File "/home/tony/google_appengine/lib/webapp2-2.3/webapp2.py", line 1505, in __call__ 
    rv = self.router.dispatch(request, response) 
    File "/home/tony/google_appengine/lib/webapp2-2.3/webapp2.py", line 1253, in default_dispatcher 
    return route.handler_adapter(request, response) 
    File "/home/tony/google_appengine/lib/webapp2-2.3/webapp2.py", line 1077, in __call__ 
    return handler.dispatch() 
    File "/home/tony/google_appengine/lib/webapp2-2.3/webapp2.py", line 545, in dispatch 
    return method(*args, **kwargs) 
    File "/home/tony/work/qmag/gaetests/src/views.py", line 37, in post 
    return self.get() 
    File "/home/tony/work/qmag/gaetests/src/views.py", line 34, in get 
    raise BaseException('Deu pau :-)') 
BaseException: Deu pau :-) 
INFO  2014-10-30 15:49:05,735 module.py:666] default: "POST /task_dapau HTTP/1.1" 500 - 
WARNING 2014-10-30 15:49:05,735 taskqueue_stub.py:1986] Task task4 failed to execute. The task has no remaining retries. Failing permanently after 0 retries and 0 seconds 

這是一個錯誤? (它真的看起來像這樣)

有沒有簡單的解決方法呢?

+0

提交的他們的跟蹤錯誤 - https://code.google.com/p/googleappengine/issues/detail?id=11425 – 2014-10-30 17:10:40

+0

相關:http://stackoverflow.com/questions/5505416/google -app-engine-task-retry-limit-doesnt-work – 2014-10-30 18:15:36

回答

2

As mentioned in the documentation App Engine有時會運行兩次任務。你應該寫下你的任務,以確保這不會有害。

+0

Geeze謝謝!他們應該提到這個*非常接近*他們說'task_retry_limit'應該做什麼的地方>:| – 2014-10-30 21:06:28

2

我只是找到了一種方法,以避免不希望重試:

taskqueue.add(
    url='/blah', 
    queue_name='myq', 
    retry_options=TaskRetryOptions(task_retry_limit=0, task_age_limit=1), 
    countdown=1, 
) 

的RETRY_LIMIT,age_limit和倒計時的這種組合是神奇的咒語,做的伎倆。

雖然它仍然不是最理想的,所以我會在沒有綠色答案的情況下離開它,直到谷歌修復了這個錯誤。

-1

檢查您的queue.yaml文件並確保它已正確配置。

queue: 
- name: default 
    retry_parameters: 
    task_retry_limit: 0 
相關問題