class OrderRetryTask(base.BarbicanObject, base.BarbicanPersistentObject, object_base.VersionedObjectDictCompat): fields = { 'id': fields.StringField(default=utils.generate_uuid()), 'order_id': fields.StringField(), 'retry_task': fields.StringField(), 'retry_at': fields.DateTimeField(nullable=True, default=None), 'retry_args': fields.JsonField(), 'retry_kwargs': fields.JsonField(), 'retry_count': fields.IntegerField(default=0) } db_model = models.OrderRetryTask db_repo = repos.get_order_retry_tasks_repository() @classmethod def get_by_create_date(cls, only_at_or_before_this_date=None, offset_arg=None, limit_arg=None, suppress_exception=False, session=None): entities_db, offset, limit, total = cls.db_repo.get_by_create_date( only_at_or_before_this_date, offset_arg, limit_arg, suppress_exception, session) entities = [cls()._from_db_object(entity_db) for entity_db in entities_db] return entities, offset, limit, total
def create_order_retry(order=None, retry_task="", retry_args=[], retry_kwargs={}, retry_at=None, session=None): order_retry = models.OrderRetryTask() order_retry.retry_task = retry_task order_retry.retry_args = retry_args order_retry.retry_kwargs = retry_kwargs if not retry_at: order_retry.retry_at = datetime.datetime.utcnow() order_retry.order_id = order.id order_retry_task_repo = repositories.get_order_retry_tasks_repository() order_retry_task_repo.create_from(order_retry, session) return order_retry
def schedule_order_retry_tasks( invoked_task, retry_result, context, *args, **kwargs): """Schedules an Order-related task for retry. :param invoked_task: The RPC method that was just invoked. :param retry_result: A :class:`FollowOnProcessingStatusDTO` if follow-on processing (such as retrying this or another task) is required, otherwise None indicates no such follow-on processing is required. :param context: Queue context, not used. :param order_id: ID of the Order entity the task to retry is for. :param args: List of arguments passed in to the just-invoked task. :param kwargs: Dict of arguments passed in to the just-invoked task. :return: Returns the RPC task method scheduled for a retry, None if no RPC task was scheduled. """ retry_rpc_method = None order_id = kwargs.get('order_id') if not retry_result or not order_id: pass elif common.RetryTasks.INVOKE_SAME_TASK == retry_result.retry_task: if invoked_task: retry_rpc_method = getattr( invoked_task, '__name__', None) else: retry_rpc_method = MAP_RETRY_TASKS.get(retry_result.retry_task) if retry_rpc_method: LOG.debug( 'Scheduling RPC method for retry: {0}'.format(retry_rpc_method)) date_to_retry_at = datetime.datetime.utcnow() + datetime.timedelta( milliseconds=retry_result.retry_msec) retry_model = models.OrderRetryTask() retry_model.order_id = order_id retry_model.retry_task = retry_rpc_method retry_model.retry_at = date_to_retry_at retry_model.retry_args = args retry_model.retry_kwargs = kwargs retry_model.retry_count = 0 retry_repo = repositories.get_order_retry_tasks_repository() retry_repo.create_from(retry_model) return retry_rpc_method
def schedule_order_retry_tasks(invoked_task, retry_result, context, *args, **kwargs): """Schedules an Order-related task for retry. :param invoked_task: The RPC method that was just invoked. :param retry_result: A :class:`FollowOnProcessingStatusDTO` if follow-on processing (such as retrying this or another task) is required, otherwise None indicates no such follow-on processing is required. :param context: Queue context, not used. :param order_id: ID of the Order entity the task to retry is for. :param args: List of arguments passed in to the just-invoked task. :param kwargs: Dict of arguments passed in to the just-invoked task. :return: Returns the RPC task method scheduled for a retry, None if no RPC task was scheduled. """ retry_rpc_method = None order_id = kwargs.get('order_id') if not retry_result or not order_id: pass elif common.RetryTasks.INVOKE_SAME_TASK == retry_result.retry_task: if invoked_task: retry_rpc_method = find_function_name(invoked_task) else: retry_rpc_method = MAP_RETRY_TASKS.get(retry_result.retry_task) if retry_rpc_method: LOG.debug( 'Scheduling RPC method for retry: {0}'.format(retry_rpc_method)) date_to_retry_at = datetime.datetime.utcnow() + datetime.timedelta( milliseconds=retry_result.retry_msec) retry_model = models.OrderRetryTask() retry_model.order_id = order_id retry_model.retry_task = retry_rpc_method retry_model.retry_at = date_to_retry_at retry_model.retry_args = args retry_model.retry_kwargs = kwargs retry_model.retry_count = 0 retry_repo = repositories.get_order_retry_tasks_repository() retry_repo.create_from(retry_model) return retry_rpc_method
def create_order_retry(order=None, retry_task="", retry_args=[], retry_kwargs={}, retry_at=None, session=None): order_retry = models.OrderRetryTask() order_retry.retry_task = retry_task order_retry.retry_args = retry_args order_retry.retry_kwargs = retry_kwargs if not retry_at: order_retry.retry_at = datetime.datetime.utcnow() order_retry.order_id = order.id order_retry_task_repo = repositories.get_order_retry_tasks_repository() order_retry_task_repo.create_from(order_retry, session) return order_retry
def __init__(self, queue_resource=None): super(PeriodicServer, self).__init__() # Setting up db engine to avoid lazy initialization repositories.setup_database_engine_and_factory() # Connect to the worker queue, to send retry RPC tasks to it later. self.queue = queue_resource or async_client.TaskClient() # Start the task retry periodic scheduler process up. periodic_interval = ( CONF.retry_scheduler.periodic_interval_max_seconds) self.tg.add_dynamic_timer( self._check_retry_tasks, initial_delay=CONF.retry_scheduler.initial_delay_seconds, periodic_interval_max=periodic_interval) self.order_retry_repo = repositories.get_order_retry_tasks_repository()
def __init__(self, queue_resource=None): super(PeriodicServer, self).__init__() # Setting up db engine to avoid lazy initialization repositories.setup_database_engine_and_factory() # Connect to the worker queue, to send retry RPC tasks to it later. self.queue = queue_resource or async_client.TaskClient() # Start the task retry periodic scheduler process up. periodic_interval = ( CONF.retry_scheduler.periodic_interval_max_seconds ) self.tg.add_dynamic_timer( self._check_retry_tasks, initial_delay=CONF.retry_scheduler.initial_delay_seconds, periodic_interval_max=periodic_interval) self.order_retry_repo = repositories.get_order_retry_tasks_repository()
def _create_retry_task(self): # Add one retry task: task = 'test_task' args = ('foo', 'bar') kwargs = {'k_foo': 1, 'k_bar': 2} order = database_utils.create_order() retry = models.OrderRetryTask() retry.order_id = order.id retry.retry_at = datetime.datetime.utcnow() retry.retry_task = task retry.retry_args = args retry.retry_kwargs = kwargs retry_repo = repositories.get_order_retry_tasks_repository() retry_repo.create_from(retry) database_utils.get_session().commit() return args, kwargs, retry_repo
def _create_retry_task(self): # Add one retry task: task = 'test_task' args = ('foo', 'bar') kwargs = {'k_foo': 1, 'k_bar': 2} order = database_utils.create_order() retry = models.OrderRetryTask() retry.order_id = order.id retry.retry_at = datetime.datetime.utcnow() retry.retry_task = task retry.retry_args = args retry.retry_kwargs = kwargs retry_repo = repositories.get_order_retry_tasks_repository() retry_repo.create_from(retry) database_utils.get_session().commit() return args, kwargs, retry_repo