Так что я в настоящее время разрабатываю систему выставления счетов, предназначенную для запуска один раз в неделю. Мы разделяем наших клиентов на 4 цикла, которые работают один раз в неделю. Каков наилучший способ запланировать выполнение задания Cron один раз в неделю, но каждый раз, когда будет определен конкретный аргумент, в зависимости от того, в какой день этого месяца. Например, я хочу, чтобы все клиенты, которые получают счета-фактуры в 8-м месяце, отправлялись в 12:00 AM 8 числа каждого месяца. На следующей неделе я хочу запустить ту же самую программу, за исключением того, что хочу запустить ее на 15-й. Должен ли я иметь четыре отдельных задания с 4 конкретными параметрами, которые все выполняются один раз в месяц или есть более гладкий способ сохранить все в одной программе и одно задание, которое выполняется еженедельно, но с разными аргументами? Я переусердствовал?Запланируйте задание Java, которое будет выполняться раз в неделю с различными параметрами каждый раз
ответ
Имея дело с чувствительными бизнес-проблемами, такими как описанные вами, я никогда не буду полагаться на планирование, чтобы управлять состоянием. Я бы предпочел полностью оставить управление государством в программе.
Итак, лучше всего использовать базу данных или файл, в котором хранится состояние, так что планирование не влияет на то, что делает ваша программа. При таком подходе у вас может быть одно задание cron
, которое запускается один раз в неделю.
состояние информация будет храниться (в зависимости от того, что вы заявили):
- клиент
- номер цикла
- дата последнего запуска
Программа должна быть способна:
- Не повторяется (если это ru п снова в течение той же недели, он никогда не должен повторить цикл)
- Восполнить пробел (если запустить его после перерыва, на неделю или больше, он должен быть в состоянии выполнить все пропустил циклов)
Вы overthinking его;) Вы можете иметь запись хрон для всех 4-х циклов, как это:
0 0 8,15,22,29 * * command
и добавить корпус переключатель или если заявление проверки дня месяца с датой + "% D », но это усложнит задачу. Не говоря уже о читаемости.
Другим подходом было бы создание сценария оболочки, который бы удерживал всю описанную выше логику «случая» и устанавливал оболочку как команду cron. , например.
day_of_month=$(date +'%d')
case "${day_of_month}" in
'8') params='your params here' ;;
...
esac
/your/program "${params}"
Вы всегда можете сохранить его простым и использовать 4 отдельные записи crontab.
Хмм да, я не могу решить, между 4 отдельными кронами или тем, что еженедельно.Это похоже на суперпростую проблему, но она должна быть на 100% точнее в том смысле, что она не пропускает ни одного клиента в заданном цикле, а также не отправляет тот, который не находится в текущем цикле. –
Cron будет запускать все, что вы скажете запустить. Тем не менее, у @codeforester есть хороший момент (я не могу вообще прокомментировать); - это лучший подход, чтобы разделить бизнес-логику. Например. вы запускаете программу из cron еженедельно, программа проверяет расписание и запускает только то, что она должна запускать. Я парень базы данных, поэтому я буду хранить его в базе данных, хранить все элементы в таблице расписания, программа будет читать все записи, запланированные на сегодняшний день, запускать все отдельно (так что ошибка в одной записи не сломает все) , и статус сообщения (дата последнего запуска, сообщение об успешном завершении/сбое) обратно в базу данных. – michal
Это имеет смысл, у меня есть идентификатор клиента, номер цикла i.e. (01,08,15,22), но у меня нет даты последнего запуска. Я думал о наличии нескольких аргументов программы, один из которых был целым циклом, то есть всем клиентам, которым был отправлен 1 цикл, а затем также принимать индивидуальные идентификаторы клиента в случае, если один из них не отправлен, или ему необходимо повторно отправить или любые другие аномалии. Я согласен, что программа должна иметь полный контроль над тем, какие из них отправлены, и не оставлять это до cron, но если, например, он работает 7-го числа в полночь, должен ли я иметь некоторую логику, например, текущую дату +1 день, чтобы получить все из 08 циклов? –