mher / flower

Real-time monitor and web admin for Celery distributed task queue
https://flower.readthedocs.io
Other
6.42k stars 1.08k forks source link

[FEATURE] Option to retry a failed task #1348

Open eriktelepovsky opened 8 months ago

eriktelepovsky commented 8 months ago

Hi

Is your feature request related to a problem? Please describe. I'm always frustrated when I need to manually execute a script to retry a failed task. I know there is a possibility to setup a failover and retry strategy, but sometimes it is more suitable to retry the task immediately on demand.

Describe the solution you'd like It would be great if there is a button in the UI for the failed task to retry it. It would execute the task with the same parameters.

Describe alternatives you've considered There is a django-celery-results app alternative which I can add a custom action to retry the specific tasks, but flower is much better tool. The only missing thing is the "retry button".

Additional context Snippet I currently use:

def retry_task(task_id):    
    meta = celery_app.backend.get_task_meta(task_id)
    task = celery_app.tasks[meta['name']]
    task.apply_async(args=meta['args'], kwargs=meta['kwargs'])

Thank you in advance!

dgarciams2s commented 7 months ago

It would be great, really

iamliamc commented 2 months ago

I agree this would be really useful

kooshan75 commented 2 weeks ago

Need this too, it'd be much appreciated.

iamliamc commented 2 weeks ago

I ended up with something like this:

    def retry_task(self, task_id: str) -> AsyncResult:
        meta = self.celery_app.backend.get_task_meta(task_id)  # type: ignore
        task = self.celery_app.tasks[meta["name"]]
        results = task.apply_async(args=meta["args"], kwargs=meta["kwargs"])
        return AsyncResult(
            id=results.id,
            name=results.name,
            status=results.status,
            result=results.result,
            traceback=results.traceback,
            args=results.args,
            kwargs=results.kwargs,
            date_done=results.date_done,
        )