Несколько шаблонов, запущенных одновременно - PullRequest
1 голос
/ 17 декабря 2010

Я запланировал запуск шаблона Coldfusion каждые 10 минут. Как мне запретить его запуск, если предыдущий запуск превысил 10 минут.

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

PS. Существует ли система Coldfuison для интеграции приложений (серверная часть)

Ответы [ 2 ]

6 голосов
/ 17 декабря 2010

Используйте эксклюзивное имя cflock :

<cflock 
    timeout = "#createTimeSpan(0,0,0,1)#"
    name = "myProcess"
    throwOnTimeout = "no"
    type = "exclusive"> 
    <cfset start = now()>
    <!--- CFML to be synchronized. ---> 
    <cfset interval = 10 * 60> <!--- 10 minutes in seconds --->
    <cfif dateDiff("s", start, now()) GT interval>
        <cfhttp url="yourtemplate.cfm">
    </cfif>
</cflock>

Это гарантирует, что только поток когда-либо запускает рассматриваемый блок кода. Одновременный доступ потерпит неудачу за одну секунду без ошибок.

Чтобы гарантировать, что следующий запуск будет запущен, если предыдущий превысит временной интервал, отследите время начала внутри блокировки, а затем в конце, если он превысил интервал, последний оператор внутри cflock будет вызываться cfhttp сам.

1 голос
/ 17 декабря 2010

Один из возможных маршрутов, который вы можете изучить:

Вы можете настроить таблицу базы данных для отслеживания хода выполнения задачи.Может быть, имя таблицы «задача» со столбцами «имя задачи» и «inProgress», причем последнее является логическим значением.Когда задача запускается, установите inProgress в значение true.Когда он завершится, задайте для inProgress значение false.

В шаблоне, вызываемом запланированной задачей, сначала проверьте его состояние inProgress указанной задачи.Если это правда, просто прервите.В противном случае продолжите.

РЕДАКТИРОВАТЬ:

Хмм ... это на самом деле не будет работать лучше, чем переменные вашего приложения в случае тайм-аутов или ошибок.Так что теперь думая, что вместо логического, вы используете метку времени.Когда запланированная задача сработает, обновите значение с текущим временем.Когда он завершится, очистите его.

Поэтому, когда задача запускается снова, она увидит, что предыдущая задача либо завершена (нулевое значение), либо все еще выполняется.-Если это все еще в процессе, вы можете сделать dateDiff () для значения, чтобы увидеть, было ли это больше, чем 'x' минут назад.Если это так, вы можете предположить, что предыдущая задача вышла из строя (или по ошибке ... но в этом случае я думаю, что вы могли бы поместить некоторую обработку ошибок в саму задачу) и запустить текущий экземпляр задачи.

...