# Scheduler

## Шаблон Scheduler <a href="#template_sheduler" id="template_sheduler"></a>

```xml
<Scheduler>
  <Task Name="">
    <Condition Type="Values">
      <Month></Month>
      <Day><Day>
      <Hour></Hour>
      <Minute></Minute>
      <Second></Second>
    </Condition>
    <Commands StopOnError="">
      <Command Name="" />
      <Command Name="">
        <Parameter Name="" />
        <Parameter Name="" />
      </Commands>
      <If>
        <When></When>
        <Then StopOnError="">
          <Command Name="" />
        </Then>
        <ElseIf>
          <When></When>
          <Then StopOnError="">
            <Command Name="">
              <Parameter Name="" />
              <Parameter Name="" />
            </Command>
          </Then>
        </ElseIf>
        <Else StopOnError="">
          <Command Name="" />
        </Else>
      </If>
    </Commands>
    <ExecutionStrategy></ExecutionStrategy>
  </Task>
  <Task Name="">
    <Condition Type="Query">
      <Text></Text>
    </Condition>
    <Commands>
      <Command Name="" />
    </Commands>
    <ExecutionStrategy></ExecutionStrategy>
  </Task>
  <Task Name="">
    <Condition Type="OnStart" />
    <Commands>
      <Command Name="" />
    </Commands>
    <ExecutionStrategy></ExecutionStrategy>
  </Task>
</Scheduler>
```

## Описание Task <a href="#descpription_task" id="descpription_task"></a>

```xml
<Task Name="TaskName">
  <!--Тэги, специфичные для Task-->
</Task>
```

#### Атрибуты Task <a href="#attributes_task" id="attributes_task"></a>

<table data-header-hidden><thead><tr><th align="center"></th><th width="431.3333333333333"></th></tr></thead><tbody><tr><td align="center">Name</td><td><p>Название условия.</p><p></p><p>Обязательный атрибут.</p></td></tr></tbody></table>

## Тэги, специфичные для Task <a href="#tags_task" id="tags_task"></a>

### Condition <a href="#condition" id="condition"></a>

Условие, которое используется для запуска задач.

```xml
<Condition Type="" />
```

#### Атрибуты тэга `<Condition>` <a href="#attributes_tag_condition" id="attributes_tag_condition"></a>

<table data-header-hidden><thead><tr><th align="center"></th><th width="454.3333333333333"></th></tr></thead><tbody><tr><td align="center">Type</td><td><p>Тип условия. </p><p></p><p>Обязательный атрибут. Ожидается имя одного из типов условий: <a href="#tags_condition_values">Values</a>, <a href="#tags_condition_query">Query</a> или <a href="#tags_condition_on_start">OnStart</a>.</p></td></tr></tbody></table>

### Commands <a href="#commands" id="commands"></a>

Список команд, которые будут выполнены последовательно.

Обязательный тэг. В качестве значения тэга ожидается список тэгов [`<Command>`](#commands_command) и/или конструкций [`<If>`](https://wfsys.gitbook.io/workflow-engine-syntax/workflow_engine/broken-reference).

```xml
<Commands StopOnError="True">
  <Command Name="CommandName1" />
  <Command Name="CommandName2">
    <Parameter Name="ParameterName1">parameter 1</Parameter>
    <Parameter Name="ParameterName2">parameter 2</Parameter>
  </Command>
  <If>
    <When></When>
    <Then StopOnError="True">
      <Command Name="CommandName3">
        <Parameter Name="ParameterName1">parameter 1</Parameter>
        <Parameter Name="ParameterName2">parameter 2</Parameter>
      </Command>
    </Then>
    <ElseIf>
      <When></When>
      <Then StopOnError="True">
        <Command Name="CommandName4" />
      </Then>
    </ElseIf>
    <Else StopOnError="True">
      <Command Name="CommandName5" />
    </Else>
  </If>
</Commands>
```

#### Тэг `<Command>` <a href="#commands_command" id="commands_command"></a>

Обращение к команде по имени для ее выполнения.

Необязательный тэг. В качестве значения тэга ожидается список тэгов [`<Parameter>`](#commands_command_parameter).

```xml
<!--Вариант 1-->
<Command Name="CommandName1" />

<!--Вариант 2-->
  <Command Name="CommandName2">
    <Parameter Name="ParameterName1">parameter 1</Parameter>
    <Parameter Name="ParameterName2">parameter 2</Parameter>
  </Command>
```

#### Тэг `<Parameter>` <a href="#commands_command_parameter" id="commands_command_parameter"></a>

Дополнительный параметр, который будет передан в команду при выполнении.

Необязательный тэг. Значение тэга `<Parameter>`: любое значение.

#### Атрибуты тэга `<Parameter>` <a href="#attributes_tag_commands_command_parameter" id="attributes_tag_commands_command_parameter"></a>

<table data-header-hidden><thead><tr><th align="center"></th><th width="454.3333333333333"></th></tr></thead><tbody><tr><td align="center">Name</td><td><p>Имя входящего значения. </p><p></p><p>Ожидается имя одного из параметров, передаваемых в команду.</p></td></tr></tbody></table>

### ExecutionStrategy <a href="#execution_strategy" id="execution_strategy"></a>

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

Если тэг отсутствует, то используется значение ExecuteMissed.

Необязательный тэг. Ожидается одно из следующих значений:

<table data-header-hidden><thead><tr><th align="center"></th><th width="431.3333333333333"></th></tr></thead><tbody><tr><td align="center">ExecuteMissed</td><td>Будут запущены все пропущенные задания согласно условиям. Учитывается время последнего выполнения задачи. Если задача ранее не выполнялась, т.е. в таблице public.schedule в базе данных отсутствует запись, то будет выполнен только один пропущенный вызов.</td></tr><tr><td align="center">ExecuteLastMissed</td><td>Будет запущено последнее пропущенное задание, а далее согласно условиям</td></tr><tr><td align="center">WaitNext</td><td>Задача запускается в следующее плановое время</td></tr><tr><td align="center">Restart</td><td>Задача будет перезапущена с текущим временем</td></tr><tr><td align="center">RestartAndWaitNext</td><td>Задача будет перезапущена с текущим временем и запущена при следующем плановом запуске</td></tr></tbody></table>

```xml
<ExecutionStrategy>ExecuteMissed</ExecutionStrategy>
```

#### Пример <a href="#execution_strategy_example" id="execution_strategy_example"></a>

Задача выполняется каждые 5 минут. Текущее время 11:28. Последнее выполнение задачи было в 11:00.

При стратегии ExecuteMissed задача будет выполнена 11:05, 11:10, 11:15, 11:20, 11:25, 11:30, 11:35 и т.д.

При стратегии ExecuteLastMissed - 11:25, 11:30, 11:35 и т.д.

При стратегии WaitNext - 11:30, 11:35 и т.д.

При стратегии Restart - 11:28, 11:33, 11:38 и т.д.

При стратегии RestartAndWaitNext - 11:33, 11:38 и т.д.

## Тэги, специфичные для условия Values <a href="#tags_condition_values" id="tags_condition_values"></a>

```xml
<Condition Type="Values">
  <Month></Month>
  <Day><Day>
  <Hour></Hour>
  <Minute></Minute>
  <Second></Second>
</Condition>
```

### Condition <a href="#condition_values_condition" id="condition_values_condition"></a>

Условие, которое используется для запуска задач по расписанию.

Значение тэга `<Condition>`: список тэгов [`<Month>`](#condition_values_condition_month), [`<Day>`](#condition_values_condition_day), [`<Hour>`](#condition_values_condition_hour), [`<Minute>`](#condition_values_condition_minute) и [`<Second>`](#condition_values_condition_second).

Условие запуска задаётся в одном из описанных форматов:

* Пустое поле - ближайшее значение из интервала возможных значений. Например, для дней месяца - это значения от 1 до 31.
* \d+(,\d+){0,} - точные значения. Например, 1,5,9 будет выполняться в январе, мае, сентябре.
* \d+-\d+ - интервал значений. Например, 1-9 будет выполняться с января по сентябрь.
* /\d+ - повтор через указанный интервал времени. Например, /2 будет повторяться каждые 2 месяца, начиная с текущего.
* \d+/\d+ - повтор через указанный интервал времени, начиная с указанного значения. Например, 3/2 - будет повторяться каждые 2 месяца, начиная с марта и до конца года. В следующем году первый раз снова выполнится в марте.
* \d+-\d+/\d+ - повтор через указанный интервал времени в указанном интервале значений. Например, 3-9/2 - будет повторяться каждые 2 месяца, начиная с марта и по сентябрь включительно. В следующем году первый раз снова выполнится в марте.

#### Тэг `<Month>` <a href="#condition_values_condition_month" id="condition_values_condition_month"></a>

Задаёт месяц, в котором должно выполняться задание.

Необязательный тэг. Ожидается строка, заданная по одному из форматов запуска.

#### Тэг `<Day>` <a href="#condition_values_condition_day" id="condition_values_condition_day"></a>

Задаёт дни, в которых должно выполняться задание.

Необязательный тэг. Ожидается строка, заданная по одному из форматов запуска.

#### Тэг `<Hour>` <a href="#condition_values_condition_hour" id="condition_values_condition_hour"></a>

Задаёт часы, в которые должно выполняться задание.

Необязательный тэг. Ожидается строка, заданная по одному из форматов запуска.

#### Тэг `<Minute>` <a href="#condition_values_condition_minute" id="condition_values_condition_minute"></a>

Задаёт минуты, в которые должно выполняться задание.

Необязательный тэг. Ожидается строка, заданная по одному из форматов запуска.

#### Тэг `<Second>` <a href="#condition_values_condition_second" id="condition_values_condition_second"></a>

Задаёт секунды, в которые должно выполняться задание.

Необязательный тэг. Ожидается строка, заданная по одному из форматов запуска.

#### Пример 1 <a href="#condition_values_example_1" id="condition_values_example_1"></a>

Запускает задание в начале каждой минуты:

```xml
<Condition Type="Values">
    <Second>0</Second>
</Condition>
```

#### Пример 2 <a href="#condition_values_example_2" id="condition_values_example_2"></a>

Запускает задание каждые 5 минут каждый день, но не в начале минуты, а начиная с момента первого запуска:

```xml
<Condition Type="Values">
    <Minute>/5</Minute>
</Condition>
```

#### Пример 3 <a href="#condition_values_example_3" id="condition_values_example_3"></a>

Запускает задание с 8:00 до 21:59 каждые 5 минут (в начале минуты) каждый день:

```xml
<Condition Type="Values">
    <Hour>8-21</Hour>
    <Minute>0/5</Minute>
</Condition>
```

#### Пример 4 <a href="#condition_values_example_4" id="condition_values_example_4"></a>

Запустит задание в 7:15:19 4 февраля:

```xml
<Condition Type="Values">
    <Month>2</Month>
    <Day>4</Day>
    <Hour>7</Hour>
    <Minute>15</Minute>
    <Second>19</Second>
</Condition>
```

## Тэги, специфичные для условия Query <a href="#tags_condition_query" id="tags_condition_query"></a>

```xml
<Condition Type="Query">
  <Text>
    SELECT 1 AS "Month"
    FROM table
  </Text>
</Condition>
```

### Condition <a href="#condition_query_condition" id="condition_query_condition"></a>

Условие используется для запуска задач по расписанию с динамическим заданием условия запуска через базу данных.

Значение тэга `<Condition>`: тэг [`<Text>`](#condition_query_condition_text).

#### Тэг `<Text>` <a href="#condition_query_condition_text" id="condition_query_condition_text"></a>

Содержит sql-запрос для получения условия запуска.

Обязательный тэг. Значение тэга `<Text>`: текст sql-запроса.

Sql-запрос должен вернуть хотя бы один столбец с именем из списка: Month, Day, Hour, Minute, Second.

Формат значений столбцов описан в условии [Values](#tags_condition_values).

## Тэги, специфичные для условия OnStart <a href="#tags_condition_on_start" id="tags_condition_on_start"></a>

```xml
<Condition Type="OnStart" />
```

### Condition <a href="#condition_on_start_condition" id="condition_on_start_condition"></a>

Условие используется для запуска задач при старте сервера.

Значение тэга `<Condition>`: не ожидается.
