def submit_job(self, job): def exist(key, value): with self.filter_lock: return self.filter.exist(key, value) self.log.debug("client call submit job [%s]" % job.id) if job.need_filter: if exist(job.filter_key, job.id): self.log.debug("job [%s] has been filter..." % job.id) return False if not job.trigger: self._enqueue_job(job.job_key, job.serialize()) else: with distributed_lock(**settings.DISTRIBUTED_LOCK_CONFIG): try: self.jobstore.add_job(job) except JobAlreadyExist: if job.replace_exist: self.jobstore.update_job(job) else: self.log.warn('job [%s] already exist' % job.id) self.wake_up() return True
def start(self): """ Start elric master. Select all due jobs from jobstore and enqueue them into redis queue. Then update due jobs' information into jobstore. :return: """ if self.running: raise AlreadyRunningException self._stopped = False self.log.debug('eric master start...') self.start_subscribe_thread() while True: now = datetime.now(self.timezone) wait_seconds = None with distributed_lock(**settings.DISTRIBUTED_LOCK_CONFIG): for job_id, job_key, serialized_job in self.jobstore.get_due_jobs( now): # enqueue due job into redis queue self._enqueue_job(job_key, serialized_job) # update job's information, such as next_run_time job = Job.deserialize(serialized_job) last_run_time = Job.get_serial_run_times(job, now) if last_run_time: next_run_time = Job.get_next_trigger_time( job, last_run_time[-1]) if next_run_time: job.next_run_time = next_run_time self.update_job(job) else: # if job has no next run time, then remove it from jobstore self.remove_job(job) # get next closet run time job from jobstore and set it to be wake up time closest_run_time = self.jobstore.get_closest_run_time() if closest_run_time is not None: wait_seconds = min( max(timedelta_seconds(closest_run_time - now), 0), self.MIN_WAIT_TIME) self.log.debug('Next wakeup is due at %s (in %f seconds)' % (closest_run_time, wait_seconds)) self._event.wait(wait_seconds if wait_seconds is not None else self .MIN_WAIT_TIME) self._event.clear()
def submit_job(self, job): """ process submit_job request from worker. :type job: Job """ self.log.debug('client submit job, id=%s, key=%s' % (job.id, job.job_key)) # if job doesn't contains trigger, then enqueue it into job queue immediately if not job.trigger: self._enqueue_job(job.job_key, job.serialize()) # else store job into job store first else: with distributed_lock(**settings.DISTRIBUTED_LOCK_CONFIG): try: self.jobstore.add_job(job) except JobAlreadyExist as e: if job.replace_exist: self.update_job(job) else: self.log.error(e) # wake up when new job has store into job store self.wake_up()
def start(self): """ Start elric master. Select all due jobs from jobstore and enqueue them into redis queue. Then update due jobs' information into jobstore. :return: """ if self.running: raise AlreadyRunningException self._stopped = False self.log.debug('eric master start...') self.start_subscribe_thread() while True: now = datetime.now(self.timezone) wait_seconds = None with distributed_lock(**settings.DISTRIBUTED_LOCK_CONFIG): for job_id, job_key, serialized_job in self.jobstore.get_due_jobs(now): # enqueue due job into redis queue self._enqueue_job(job_key, serialized_job) # update job's information, such as next_run_time job = Job.deserialize(serialized_job) last_run_time = Job.get_serial_run_times(job, now) if last_run_time: next_run_time = Job.get_next_trigger_time(job, last_run_time[-1]) if next_run_time: job.next_run_time = next_run_time self.update_job(job) else: # if job has no next run time, then remove it from jobstore self.remove_job(job) # get next closet run time job from jobstore and set it to be wake up time closest_run_time = self.jobstore.get_closest_run_time() if closest_run_time is not None: wait_seconds = min(max(timedelta_seconds(closest_run_time - now), 0), self.MIN_WAIT_TIME) self.log.debug('Next wakeup is due at %s (in %f seconds)' % (closest_run_time, wait_seconds)) self._event.wait(wait_seconds if wait_seconds is not None else self.MIN_WAIT_TIME) self._event.clear()