From 78de71a7ff48312e0ba5dfbd1080c29a8d84032b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Helle=C5=9Ben?= Date: Thu, 26 Mar 2026 19:28:19 +0100 Subject: [PATCH] Refactor archive_feed_task to include auto-retry and error handling --- feeds/tasks.py | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/feeds/tasks.py b/feeds/tasks.py index 9fa21f0..3a8fc5d 100644 --- a/feeds/tasks.py +++ b/feeds/tasks.py @@ -1,14 +1,24 @@ +from typing import TYPE_CHECKING + from celery import shared_task from feeds.models import Feed from feeds.services import fetch_and_archive_feed +if TYPE_CHECKING: + from celery import Task -@shared_task -def archive_feed_task(feed_id: int) -> str: + +@shared_task( + bind=True, + autoretry_for=(Exception,), + retry_kwargs={"max_retries": 3, "countdown": 60}, +) +def archive_feed_task(self: Task, feed_id: int) -> str: """Celery task to fetch and archive a feed by its ID. Args: + self: The task instance. feed_id: The ID of the Feed to archive. Returns: @@ -18,7 +28,14 @@ def archive_feed_task(feed_id: int) -> str: feed: Feed = Feed.objects.get(id=feed_id) except Feed.DoesNotExist: return f"Feed with id {feed_id} does not exist." - new_entries_count: int = fetch_and_archive_feed(feed) - if new_entries_count > 0: - return f"Archived {new_entries_count} new entries for {feed.url}" - return f"No new entries archived for {feed.url}" + + try: + new_entries_count: int = fetch_and_archive_feed(feed) + + # TODO(TheLovinator): Replace with a specific exception type # noqa: TD003 + except ValueError as e: + raise self.retry(exc=e) from e + else: + if new_entries_count > 0: + return f"Archived {new_entries_count} new entries for {feed.url}" + return f"No new entries archived for {feed.url}"