2017-01-21 2 views
1

Так что я в настоящее время разрабатываю систему выставления счетов, предназначенную для запуска один раз в неделю. Мы разделяем наших клиентов на 4 цикла, которые работают один раз в неделю. Каков наилучший способ запланировать выполнение задания Cron один раз в неделю, но каждый раз, когда будет определен конкретный аргумент, в зависимости от того, в какой день этого месяца. Например, я хочу, чтобы все клиенты, которые получают счета-фактуры в 8-м месяце, отправлялись в 12:00 AM 8 числа каждого месяца. На следующей неделе я хочу запустить ту же самую программу, за исключением того, что хочу запустить ее на 15-й. Должен ли я иметь четыре отдельных задания с 4 конкретными параметрами, которые все выполняются один раз в месяц или есть более гладкий способ сохранить все в одной программе и одно задание, которое выполняется еженедельно, но с разными аргументами? Я переусердствовал?Запланируйте задание Java, которое будет выполняться раз в неделю с различными параметрами каждый раз

ответ

1

Имея дело с чувствительными бизнес-проблемами, такими как описанные вами, я никогда не буду полагаться на планирование, чтобы управлять состоянием. Я бы предпочел полностью оставить управление государством в программе.

Итак, лучше всего использовать базу данных или файл, в котором хранится состояние, так что планирование не влияет на то, что делает ваша программа. При таком подходе у вас может быть одно задание cron, которое запускается один раз в неделю.

состояние информация будет храниться (в зависимости от того, что вы заявили):

  • клиент
  • номер цикла
  • дата последнего запуска

Программа должна быть способна:

  • Не повторяется (если это ru п снова в течение той же недели, он никогда не должен повторить цикл)
  • Восполнить пробел (если запустить его после перерыва, на неделю или больше, он должен быть в состоянии выполнить все пропустил циклов)
+1

Это имеет смысл, у меня есть идентификатор клиента, номер цикла i.e. (01,08,15,22), но у меня нет даты последнего запуска. Я думал о наличии нескольких аргументов программы, один из которых был целым циклом, то есть всем клиентам, которым был отправлен 1 цикл, а затем также принимать индивидуальные идентификаторы клиента в случае, если один из них не отправлен, или ему необходимо повторно отправить или любые другие аномалии. Я согласен, что программа должна иметь полный контроль над тем, какие из них отправлены, и не оставлять это до cron, но если, например, он работает 7-го числа в полночь, должен ли я иметь некоторую логику, например, текущую дату +1 день, чтобы получить все из 08 циклов? –

0

Вы 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.

+0

Хмм да, я не могу решить, между 4 отдельными кронами или тем, что еженедельно.Это похоже на суперпростую проблему, но она должна быть на 100% точнее в том смысле, что она не пропускает ни одного клиента в заданном цикле, а также не отправляет тот, который не находится в текущем цикле. –

+1

Cron будет запускать все, что вы скажете запустить. Тем не менее, у @codeforester есть хороший момент (я не могу вообще прокомментировать); - это лучший подход, чтобы разделить бизнес-логику. Например. вы запускаете программу из cron еженедельно, программа проверяет расписание и запускает только то, что она должна запускать. Я парень базы данных, поэтому я буду хранить его в базе данных, хранить все элементы в таблице расписания, программа будет читать все записи, запланированные на сегодняшний день, запускать все отдельно (так что ошибка в одной записи не сломает все) , и статус сообщения (дата последнего запуска, сообщение об успешном завершении/сбое) обратно в базу данных. – michal