【问题标题】:Schedule a Java job to run once a week with different parameters each time安排一个 Java 作业每周运行一次,每次使用不同的参数
【发布时间】:2017-01-22 03:15:32
【问题描述】:

所以我目前正在设计一个每周运行一次的发票系统。我们将客户分为 4 个周期,每周运行一次。什么是安排 Cron 作业每周运行一次的最佳方法,但每次都有一个特定的参数,具体取决于它是一个月中的哪一天。例如,我希望所有在每月 8 日收到发票的客户在每月 8 日凌晨 12:00 发送出去。下周我想运行完全相同的程序,除了我想在 15 号运行它。我应该有四个单独的作业,每个作业都有 4 个特定参数,每个作业都运行一次,还是有一种更时尚的方法可以将所有内容保存在一个程序中,一个作业每周运行一次,但参数不同?我是不是想多了?

【问题讨论】:

    标签: java linux cron


    【解决方案1】:

    在处理您所描述的敏感业务问题时,我绝不会依赖cron 调度来管理状态。我宁愿把状态管理完全交给程序。

    因此,最好使用存储状态的数据库或文件,这样调度就不会影响您的程序所做的事情。通过这种方法,您可以拥有一个每周运行一次的 cron 作业。

    要存储的状态信息(根据您所说的):

    • 客户
    • 循环次数
    • 上次运行日期

    程序必须能够:

    • 不重复(如果在同一周内再次运行,则绝不应重复一个循环)
    • 填补空白(如果我们在间隔一周或更长时间后运行它,它应该能够运行所有错过的周期)

    【讨论】:

    • 有道理,我确实有客户 ID、周期编号,即 (01,08,15,22),但我没有最后运行日期。我正在考虑有一些程序参数,其中一个是整个周期,即所有客户都被发送一个周期,然后在没有发送或必须重新发送的情况下接受单个客户 ID 或任何其他异常。我同意程序应该完全控制发送哪些内容,而不是将其留给 cron,但是如果它在午夜 7 日运行,我是否应该有一些逻辑,比如当前日期 +1 天来获取所有 08 个周期?
    【解决方案2】:

    你想多了 ;) 您可以像这样对所有 4 个周期进行 cron 条目:

    0 0 8,15,22,29 * * command
    

    并添加 case switch 或 if 语句使用 date +“%d”检查月份中的哪一天,但这会使任务过于复杂。更不用说可读性了。

    其他方法是创建一个包装器脚本,该脚本将包含上面提到的所有“案例”逻辑,并将包装器设置为 cron 命令。 例如

    day_of_month=$(date +'%d')
    case "${day_of_month}" in
    '8') params='your params here' ;;
    ...
    esac
    /your/program "${params}"
    

    您始终可以保持简单并使用 4 个单独的 crontab 条目。

    【讨论】:

    • 嗯,是的,我无法在 4 个单独的 cronjobs 或每周运行的一个之间做出决定。这似乎是一个超级简单的问题,但它必须 100% 准确,因为它不会错过给定周期内的任何客户,也不会发送不在当前周期内的客户
    • Cron 将运行您告诉它运行的任何内容。但是@codeforester 有一个很好的观点(我还不能评论任何地方;)) - 这是保持业务逻辑分离的更好方法。例如。您每周从 cron 运行一个程序,程序检查计划并仅运行它应该运行的内容。我是一名数据库专家,所以我会将它保存在数据库中,将所有项目存储在日程表中,程序将读取今天安排的所有条目,单独运行(因此一个条目中的错误不会破坏一切) ,并将状态(上次运行日期、成功/失败消息)发布回数据库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 2020-07-11
    相关资源
    最近更新 更多