33import socket
44import warnings
55
6+ from datetime import datetime
7+
68from celery import conf
79from celery import log
810from celery import platform
911from celery .datastructures import ExceptionInfo
1012from celery .execute .trace import TaskTrace
1113from celery .loaders import current_loader
1214from celery .registry import tasks
13- from celery .utils import noop , kwdict , fun_takes_kwargs
15+ from celery .utils import noop , kwdict , fun_takes_kwargs , maybe_iso8601
1416from celery .utils .compat import any
1517from celery .utils .mail import mail_admins
1618from celery .worker import state
@@ -208,12 +210,14 @@ class TaskRequest(object):
208210 def __init__ (self , task_name , task_id , args , kwargs ,
209211 on_ack = noop , retries = 0 , delivery_info = None , hostname = None ,
210212 email_subject = None , email_body = None , logger = None ,
211- eventer = None , ** opts ):
213+ eventer = None , eta = None , expires = None , ** opts ):
212214 self .task_name = task_name
213215 self .task_id = task_id
214216 self .retries = retries
215217 self .args = args
216218 self .kwargs = kwargs
219+ self .eta = eta
220+ self .expires = expires
217221 self .on_ack = on_ack
218222 self .delivery_info = delivery_info or {}
219223 self .hostname = hostname or socket .gethostname ()
@@ -224,9 +228,16 @@ def __init__(self, task_name, task_id, args, kwargs,
224228
225229 self .task = tasks [self .task_name ]
226230
231+ def maybe_expire (self ):
232+ if self .expires and datetime .now () > self .expires :
233+ state .revoked .add (self .task_id )
234+ self .task .backend .mark_as_revoked (self .task_id )
235+
227236 def revoked (self ):
228237 if self ._already_revoked :
229238 return True
239+ if self .expires :
240+ self .maybe_expire ()
230241 if self .task_id in state .revoked :
231242 self .logger .warn ("Skipping revoked task: %s[%s]" % (
232243 self .task_name , self .task_id ))
@@ -253,6 +264,8 @@ def from_message(cls, message, message_data, logger=None, eventer=None,
253264 args = message_data ["args" ]
254265 kwargs = message_data ["kwargs" ]
255266 retries = message_data .get ("retries" , 0 )
267+ eta = maybe_iso8601 (message_data .get ("eta" ))
268+ expires = maybe_iso8601 (message_data .get ("expires" ))
256269
257270 _delivery_info = getattr (message , "delivery_info" , {})
258271 delivery_info = dict ((key , _delivery_info .get (key ))
@@ -265,7 +278,8 @@ def from_message(cls, message, message_data, logger=None, eventer=None,
265278 return cls (task_name , task_id , args , kwdict (kwargs ),
266279 retries = retries , on_ack = message .ack ,
267280 delivery_info = delivery_info , logger = logger ,
268- eventer = eventer , hostname = hostname )
281+ eventer = eventer , hostname = hostname ,
282+ eta = eta , expires = expires )
269283
270284 def extend_with_default_kwargs (self , loglevel , logfile ):
271285 """Extend the tasks keyword arguments with standard task arguments.
@@ -445,3 +459,10 @@ def info(self, safe=False):
445459 "time_start" : self .time_start ,
446460 "acknowledged" : self .acknowledged ,
447461 "delivery_info" : self .delivery_info }
462+
463+ def shortinfo (self ):
464+ return "%s[%s]%s%s" % (
465+ self .task_name ,
466+ self .task_id ,
467+ self .eta and " eta:[%s]" % (self .eta , ),
468+ self .expires and " expires:[%s]" % (self .expires , ))
0 commit comments