def requeue_worker(worker_id): sq = SharQ('./sharq.conf') while STOP_THREADS is False: try: with sq.redis_client().lock('sharq-requeue-lock-key', timeout=15): try: sq.requeue() except Exception as e: traceback.print_exc() except LockError: # the lock wasn't acquired within specified time pass finally: sleep(REQUEUE_INTERVAL) print("thread-{}: exiting".format(worker_id))
class SharQServer(object): """Defines a HTTP based API on top of SharQ and exposed the app to run the server. """ def __init__(self, config_path): """Load the SharQ config and define the routes.""" # read the configs required by sharq-server. self.config = ConfigParser.SafeConfigParser() self.config.read(config_path) # pass the config file to configure the SharQ core. self.sq = SharQ(config_path) self.app = Flask(__name__) # set the routes self.app.add_url_rule('/', view_func=self._view_index, methods=['GET']) self.app.add_url_rule('/enqueue/<queue_type>/<queue_id>/', view_func=self._view_enqueue, methods=['POST']) self.app.add_url_rule('/dequeue/', defaults={'queue_type': 'default'}, view_func=self._view_dequeue, methods=['GET']) self.app.add_url_rule('/dequeue/<queue_type>/', view_func=self._view_dequeue, methods=['GET']) self.app.add_url_rule('/finish/<queue_type>/<queue_id>/<job_id>/', view_func=self._view_finish, methods=['POST']) self.app.add_url_rule('/interval/<queue_type>/<queue_id>/', view_func=self._view_interval, methods=['POST']) self.app.add_url_rule('/metrics/', defaults={ 'queue_type': None, 'queue_id': None }, view_func=self._view_metrics, methods=['GET']) self.app.add_url_rule('/metrics/<queue_type>/', defaults={'queue_id': None}, view_func=self._view_metrics, methods=['GET']) self.app.add_url_rule('/metrics/<queue_type>/<queue_id>/', view_func=self._view_metrics, methods=['GET']) self.app.add_url_rule('/deletequeue/<queue_type>/<queue_id>/', view_func=self._view_clear_queue, methods=['DELETE']) self.app.add_url_rule('/deepstatus/', view_func=self._view_deep_status, methods=['GET']) def requeue(self): """Loop endlessly and requeue expired jobs.""" job_requeue_interval = float( self.config.get('sharq', 'job_requeue_interval')) while True: self.sq.requeue() gevent.sleep(job_requeue_interval / 1000.00) # in seconds def _view_index(self): """Greetings at the index.""" return jsonify(**{'message': 'Hello, SharQ!'}) def _view_enqueue(self, queue_type, queue_id): """Enqueues a job into SharQ.""" response = {'status': 'failure'} try: request_data = json.loads(request.data) except Exception, e: response['message'] = e.message return jsonify(**response), 400 request_data.update({'queue_type': queue_type, 'queue_id': queue_id}) try: response = self.sq.enqueue(**request_data) except Exception, e: response['message'] = e.message return jsonify(**response), 400