# CronJobManager — Управление запланированными задачами

`CronJobManager` — это менеджер запланированных задач, предоставляемый NocoBase и основанный на библиотеке [cron](https://www.npmjs.com/package/cron). Он позволяет плагинам регистрировать запланированные задачи на сервере для периодического выполнения определённой логики.

## Базовое использование

```ts
import { Plugin } from '@nocobase/server';

export default class PluginCronDemo extends Plugin {
  async load() {
    this.app.cronJobManager.addJob({
      cronTime: '0 0 * * *', // Выполняется ежедневно в 00:00
      onTick: async () => {
        console.log('Ежедневная задача: очистка временных данных');
        await this.cleanTemporaryData();
      },
      timeZone: 'Asia/Shanghai',
      start: true, // Автоматический запуск
    });
  }

  async cleanTemporaryData() {
    // Здесь реализуйте логику очистки
  }
}
```

## Описание параметров

Тип `CronJobParameters` определён следующим образом (из [cron](https://www.npmjs.com/package/cron)):

```ts
export declare interface CronJobParameters {
  cronTime: string | Date | DateTime;
  onTick: CronCommand;
  onComplete?: CronCommand | null;
  start?: boolean;
  timeZone?: string;
  context?: any;
  runOnInit?: boolean;
  utcOffset?: string | number;
  unrefTimeout?: boolean;
}
```

| Параметр         | Тип                        | Описание                                                                                             |
| ---------------- | -------------------------- | ---------------------------------------------------------------------------------------------------- |
| **cronTime**     | `string \| Date \| DateTime` | Выражение времени для запланированной задачи. Поддерживает стандартные cron-выражения, например, `0 0 * * *` означает выполнение ежедневно в 00:00. |
| **onTick**       | `function`                 | Основная функция задачи. Будет вызвана в указанное время.                                            |
| **onComplete**   | `function`                 | Выполняется, когда задача остановлена методом `job.stop()` или после завершения функции `onTick`. |
| **timeZone**     | `string`                   | Указывает часовой пояс выполнения (например, `Asia/Shanghai`).                                       |
| **context**      | `any`                      | Контекст выполнения функции `onTick`.                                                                |
| **runOnInit**    | `boolean`                  | Следует ли выполнить задачу один раз сразу при инициализации.                                        |
| **utcOffset**    | `string \| number`         | Указывает смещение часового пояса.                                                                   |
| **unrefTimeout** | `boolean`                  | Определяет, должен ли цикл событий оставаться активным.                                              |

## Примеры Cron-выражений

| Выражение      | Значение                  |
| -------------- | ------------------------- |
| `* * * * *`    | Выполняется каждую минуту |
| `0 * * * *`    | Выполняется каждый час    |
| `0 0 * * *`    | Выполняется ежедневно в 00:00 |
| `0 9 * * 1`    | Выполняется каждый понедельник в 09:00 |
| `*/10 * * * *` | Выполняется каждые 10 минут |

> 💡 Вы можете использовать [crontab.guru](https://crontab.guru/) для помощи в создании выражений.

## Управление запуском и остановкой задач

```ts
const job = app.cronJobManager.addJob({ ... });
job.start(); // Запустить задачу
job.stop();  // Остановить задачу
```

:::tip

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

:::