django - 无法在 Django 中捕获 Celery 操作错误

标签 django celery

我有以下代码:

def save()
   super().save(*args, **kwargs)
   try:
       transaction.on_commit(lambda: c_task.delay(a, b, self.pk))
   except Exception as e:
       print(e)

@app.task(bind=True, name='c_task', max_retries=4, soft_time_limit_exception=300)
def c_task(self, a, b, i):

    from .models import ModelA

    try:
        json_data = entity(a,b,i, const)
        .....
    except Exception as e:

        raise self.retry(exc=e, countdown=exponential_backoff(self))

如果 Redis 服务器出现故障,我会收到 OperationalError。我尝试像以前一样使用 Celery OperationalError 或通用异常来捕获它。

该行仍在执行并抛出错误。如果 Redis 失败,我不希望一切都失败,因为我的代码有一个“解决方法”,但我无法捕捉到错误。

追溯:
 transaction.on_commit(lambda: c_task.delay(a, b, self.pk))

\lib\site-packages\celery\app\task.py in delay

            return self.apply_async(args, kwargs)

lib\site-packages\celery\app\task.py in apply_async

                **options

\lib\site-packages\celery\app\base.py in send_task

                    amqp.send_task_message(P, name, message, **options)

\lib\contextlib.py in __exit__

                    self.gen.throw(type, value, traceback)

\lib\site-packages\kombu\connection.py in _reraise_as_library_errors

                        sys.exc_info()[2])

\lib\site-packages\vine\five.py in reraise

                raise value.with_traceback(tb)

\lib\site-packages\kombu\connection.py in _reraise_as_library_errors

                yield
\lib\site-packages\celery\app\base.py in send_task

                    self.backend.on_task_call(P, task_id)
\lib\site-packages\celery\backends\redis.py in on_task_call

                self.result_consumer.consume_from(task_id)

\lib\site-packages\celery\backends\redis.py in consume_from

                return self.start(task_id)

 \lib\site-packages\celery\backends\redis.py in start

            self._consume_from(initial_task_id)

\lib\site-packages\celery\backends\redis.py in _consume_from

                self._pubsub.subscribe(key)
\lib\site-packages\redis\client.py in subscribe

            ret_val = self.execute_command('SUBSCRIBE', *iterkeys(new_channels))

 \lib\site-packages\redis\client.py in execute_command

            self._execute(connection, connection.send_command, *args)

\lib\site-packages\redis\client.py in _execute

                connection.connect()

d\lib\site-packages\redis\connection.py in connect

                raise ConnectionError(self._error_message(e))

最佳答案

你需要在下面改变

transaction.on_commit(lambda: c_task.delay(a, b, self.pk))


def run_task(a, b, pk):
   try:
      c_task.delay(a, b, pk)
   except Exception as ex:
      print(ex)
transaction.on_commit(lambda: run_task(a, b, self.pk))

这将确保处理连接异常

关于django - 无法在 Django 中捕获 Celery 操作错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49894606/

相关文章:

django - 使用 Jenkins 自动启动多个 celery 守护进程

python - VSCode 调试 Celery Worker

python - celery 重复任务不执行

Django Rest Framework、ModelSerializers 和自定义字段验证

c# - 如何使用 C# 客户端使用 Django/Python web 服务(所有方法都返回 null)?

javascript - Django:在模板中使用 javascript 在字符串中的逗号后添加空格

python - 如何从@app.task获取celery.Task对象

python - Django celery : Passing request Object to worker

python - 具有固定选项的多项选择。看不到选项(Django)

python - 在 Django >= 1.5 中引用用户模型的最佳方式