APS调度程序无缘无故引发异常django

Posted

技术标签:

【中文标题】APS调度程序无缘无故引发异常django【英文标题】:APS Scheduler raising exception for no reason django 【发布时间】:2021-12-19 14:08:44 【问题描述】:

即使目标函数接收到两个参数,它仍然会因为缺少参数而抛出错误?想知道为什么

check_device() missing 1 required positional argument: 'device_id'
    Job "check_device (trigger: interval[0:00:30], next run at: 2021-11-05 19:35:24 IST)" raised an exception

调度程序截图

def job_add(application_id,device_id,count):
    scheduler.add_job(
        check_device,
        'interval',
        args = (application_id,device_id,),
        seconds=7,
        jobstore = 'default',
        id=f'my_job_count',
        replace_existing=True,
        max_instances = 7,
        misfire_grace_time=None
    )

我正在调用的函数

def check_device(application_id,device_id):
    print('Mqtt connected ... calling on ',application_id,device_id)
    mqttc = mqtt.Client(clientId)

【问题讨论】:

你能显示 check_device 函数定义吗? @KZiovas 代码已更新 你试过 args = [application_id,device_id,], ? 我运行了您的代码,并且 ti 工作正常,也许您没有正确传递参数? 【参考方案1】:

好的,所以发布这个答案以供将来参考,我相信 APS 以某种方式将每个作业(函数)签名存储在数据库中我之前添加了一个带有一个参数的作业,在进行更改后它也在搜索先前定义的函数,但它没有 device_id 的位置参数,解决方案,只需从数据库中删除以前的工作历史(这个答案可能不准确,但如果它似乎无缘无故地给出上述错误,删除相关的工作历史应该可以完成这项工作

【讨论】:

什么数据库?这似乎不正确我刚刚创建了一个与您最初使用一个参数然后使用两个参数同名的函数。它没有引发任何错误。你确定你在运行之前保存了你的代码吗?也许您更新了函数但没有保存代码。或者您在更改 check_device() 后没有重新运行 job_add() 函数,因此调度程序保存了原始函数。这些是唯一可能的解决方案。 是的,正如我们所知,它在 DB 中维护作业,如果它不同,则使用 job_id 在作业中跟踪它,但现在说,您决定将参数传递给它将提供的作业你的错误,无论如何,我可以再次生成错误,但这不是重点,删除旧工作的数据有帮助, @KZiovas 你的答案在理想情况下和语法上都是正确的 你好。但是你指的是什么数据库? apscheduler 不适用于数据库,而不是没有您对其进行配置。 Apscheduler 将作业存储在内存中。您可以创建一个持久的作业存储,但这根本不是给定的。如果您有一个持久的作业存储,那么是的,这将导致您描述的行为。但如果是这样,请在问题中提及它,以免人们感到困惑。 好的,我知道这可能是特定的 Django 行为,我不熟悉它。【参考方案2】:

这是您的代码的虚拟版本,它可以工作。确保传递参数并正确调用函数:

from apscheduler.schedulers.blocking import BlockingScheduler


def check_device(application_id, device_id):
    print(f"Application id: application_id, Device id: device_id")


scheduler = BlockingScheduler()


def job_add(application_id, device_id, count):
    scheduler.add_job(
        check_device,
        "interval",
        args=(
            application_id,
            device_id,
        ),
        seconds=2,
        jobstore="default",
        id=f"my_job_count",
        replace_existing=True,
        max_instances=7,
        misfire_grace_time=None,
    )


job_add(application_id=5, device_id=2, count=1)
scheduler.start()

【讨论】:

感谢您的时间,把似乎参数放在不是问题的地方

以上是关于APS调度程序无缘无故引发异常django的主要内容,如果未能解决你的问题,请参考以下文章

操作系统中如何引发进程调度?

[QNX 自适应分区用户指南]8 调度器分区的安全性

Pl Sql 过程在使用 oracle 调度程序进行调度时处理异常

[QNX 自适应分区用户指南]8.2 创建调度器分区

Django 表单向导调度程序

使用 repath 参数的 Django url 调度程序