Source code for fmn.api.messaging

# SPDX-FileCopyrightText: Contributors to the Fedora Project
#
# SPDX-License-Identifier: MIT

import asyncio
import logging
import sys
import traceback

import backoff
from fastapi.concurrency import run_in_threadpool
from fedora_messaging import api
from fedora_messaging import exceptions as fm_exceptions

log = logging.getLogger(__name__)


[docs]def backoff_hdlr(details): log.warning("Publishing message failed. Retrying. %s", traceback.format_tb(sys.exc_info()[2]))
[docs]def giveup_hdlr(details): log.error("Publishing message failed. Giving up. %s", traceback.format_tb(sys.exc_info()[2]))
@backoff.on_exception( backoff.expo, (fm_exceptions.ConnectionException, fm_exceptions.PublishException), max_tries=3, on_backoff=backoff_hdlr, on_giveup=giveup_hdlr, ) def _publish(message): api.publish(message) _background_tasks = set()
[docs]async def publish(message): # Fire and forget # https://docs.python.org/3/library/asyncio-task.html#asyncio.create_task task = asyncio.create_task(run_in_threadpool(_publish, message=message)) _background_tasks.add(task) # To prevent keeping references to finished tasks forever, make each task # remove its own reference from the set after completion: task.add_done_callback(_background_tasks.discard)