def poll(self): if self._polling: return self._polling = True txn = self._store.newTransaction() try: # Look up all of the jobs events = [] jobsByTypeName = {} for job in (yield JobItem.all(txn)): jobsByTypeName.setdefault(job.workType, []).append(job) totalsByTypeName = {} for workType in JobItem.workTypes(): typeName = workType.table.model.name jobs = jobsByTypeName.get(typeName, []) totalsByTypeName[typeName] = len(jobs) jobDicts = [] for job in jobs: def formatTime(datetime): if datetime is None: return None else: # FIXME: Use HTTP time format return datetime.ctime() jobDict = dict( job_jobID=job.jobID, job_priority=job.priority, job_weight=job.weight, job_notBefore=formatTime(job.notBefore), ) work = yield job.workItem() attrs = ("workID", "group") if workType == PushNotificationWork: attrs += ("pushID", "priority") elif workType == ScheduleOrganizerWork: attrs += ("icalendarUid", "attendeeCount") elif workType == ScheduleRefreshWork: attrs += ("icalendarUid", "attendeeCount") elif workType == ScheduleReplyWork: attrs += ("icalendarUid", ) elif workType == ScheduleAutoReplyWork: attrs += ("icalendarUid", ) elif workType == GroupCacherPollingWork: attrs += () elif workType == IMIPPollingWork: attrs += () elif workType == IMIPReplyWork: attrs += ("organizer", "attendee") else: attrs = () if attrs: if work is None: self.log.error( "workItem() returned None for job: {job}", job=job) # jobDict.update((attr, None) for attr in attrs) for attr in attrs: jobDict["work_{}".format(attr)] = None else: # jobDict.update( # ("work_{}".format(attr), getattr(work, attr)) # for attr in attrs # ) for attr in attrs: jobDict["work_{}".format(attr)] = (getattr( work, attr)) jobDicts.append(jobDict) if jobDicts: events.append( dict( eventClass=typeName, eventID=time(), eventText=asJSON(jobDicts), )) events.append( dict( eventClass=u"work-total", eventID=time(), eventText=asJSON(totalsByTypeName), eventRetry=(self._pollInterval), )) # Send data self.addEvents(events) except: self._polling = False yield txn.abort() raise else: yield txn.commit() # Schedule the next poll if not hasattr(self, "_clock"): from twisted.internet import reactor self._clock = reactor self._clock.callLater(self._pollInterval / 1000, self.poll)
def poll(self): if self._polling: return self._polling = True txn = self._store.newTransaction() try: # Look up all of the jobs events = [] jobsByTypeName = {} for job in (yield JobItem.all(txn)): jobsByTypeName.setdefault(job.workType, []).append(job) totalsByTypeName = {} for workType in JobItem.workTypes(): typeName = workType.table.model.name jobs = jobsByTypeName.get(typeName, []) totalsByTypeName[typeName] = len(jobs) jobDicts = [] for job in jobs: def formatTime(datetime): if datetime is None: return None else: # FIXME: Use HTTP time format return datetime.ctime() jobDict = dict( job_jobID=job.jobID, job_priority=job.priority, job_weight=job.weight, job_notBefore=formatTime(job.notBefore), ) work = yield job.workItem() attrs = ("workID", "group") if workType == PushNotificationWork: attrs += ("pushID", "priority") elif workType == ScheduleOrganizerWork: attrs += ("icalendarUid", "attendeeCount") elif workType == ScheduleRefreshWork: attrs += ("icalendarUid", "attendeeCount") elif workType == ScheduleReplyWork: attrs += ("icalendarUid",) elif workType == ScheduleAutoReplyWork: attrs += ("icalendarUid",) elif workType == GroupCacherPollingWork: attrs += () elif workType == IMIPPollingWork: attrs += () elif workType == IMIPReplyWork: attrs += ("organizer", "attendee") else: attrs = () if attrs: if work is None: self.log.error( "workItem() returned None for job: {job}", job=job ) # jobDict.update((attr, None) for attr in attrs) for attr in attrs: jobDict["work_{}".format(attr)] = None else: # jobDict.update( # ("work_{}".format(attr), getattr(work, attr)) # for attr in attrs # ) for attr in attrs: jobDict["work_{}".format(attr)] = ( getattr(work, attr) ) jobDicts.append(jobDict) if jobDicts: events.append(dict( eventClass=typeName, eventID=time(), eventText=asJSON(jobDicts), )) events.append(dict( eventClass=u"work-total", eventID=time(), eventText=asJSON(totalsByTypeName), eventRetry=(self._pollInterval), )) # Send data self.addEvents(events) except: self._polling = False yield txn.abort() raise else: yield txn.commit() # Schedule the next poll if not hasattr(self, "_clock"): from twisted.internet import reactor self._clock = reactor self._clock.callLater(self._pollInterval / 1000, self.poll)