Отмена рабочего процесса
Рабочие процессы можно отменять программно или через CLI. При отмене рабочего процесса Queuety устанавливает статус cancelled, помещает все ожидающие и выполняющиеся задания в архив и запускает необязательный обработчик очистки.
Регистрация обработчика очистки
Используйте on_cancel() в конструкторе workflow, чтобы зарегистрировать класс, который запускается при отмене workflow. Класс обработчика должен реализовывать метод handle( array $state ): void.
PHP
use Queuety\Queuety;
Queuety::workflow( 'import_data' )
->then( FetchDataHandler::class )
->then( TransformDataHandler::class )
->then( LoadDataHandler::class )
->on_cancel( ImportCleanupHandler::class )
->dispatch( [ 'source_url' => $url ] );
Обработчик очистки получает публичное состояние workflow (все ключи, не начинающиеся с _):
PHP
class ImportCleanupHandler {
public function handle( array $state ): void {
// Clean up any partial imports.
if ( isset( $state['temp_table'] ) ) {
global $wpdb;
$wpdb->query( "DROP TABLE IF EXISTS {$state['temp_table']}" );
}
// Notify the user.
wp_mail(
$state['notify_email'] ?? '',
'Import cancelled',
'Your data import was cancelled.'
);
}
}
Отмена через PHP
Вызовите Queuety::cancel_workflow(), указав ID workflow:
PHP
Queuety::cancel_workflow( $workflow_id );
Этот метод:
- Блокирует строку workflow
- Устанавливает для workflow статус
cancelled - Перемещает все ожидающие и обрабатываемые задания workflow в отложенные с сообщением "Workflow cancelled"
- Записывает событие
workflow_cancelledи выполняет фиксацию - Запускает компенсацию завершенных шагов в обратном порядке (если она была зарегистрирована через
compensate_with()) - Запускает обработчик очистки
on_cancel(если он зарегистрирован)
Если workflow уже completed или cancelled, выбрасывается RuntimeException.
Отмена через CLI
Командная оболочка
wp queuety workflow cancel <id>
| Параметр | Описание |
|---|---|
<id> |
ID рабочего процесса для отмены (обязательно) |
Командная оболочка
wp queuety workflow cancel 42
Что происходит при отмене
При отмене workflow:
- Статус меняется на
cancelled - Компенсации шагов запускаются в обратном порядке завершения, если вы назначили их с помощью
compensate_with() - Обработчик очистки запускается после того, как строке workflow присвоен статус
cancelled - Ожидающие задания workflow немедленно перемещаются в отложенные
- Обрабатываемые задания workflow перемещаются в отложенные; когда выполняющийся обработчик завершится, его результат будет отброшен, и workflow не перейдет дальше
- Завершенные задания предыдущих шагов остаются без изменений
- Запись журнала с событием
workflow_cancelledсохраняется
Отмена и сбой
| Аспект | Сбой | Отмена |
|---|---|---|
| Причина | У шага исчерпаны попытки повтора | Явный вызов cancel_workflow() |
| Статус | failed |
cancelled |
| Можно повторить | Да, с помощью retry_workflow(), если компенсация workflow еще не выполнялась |
Нет |
| Обработчик очистки | Не вызывается | Вызывается, если зарегистрирован через on_cancel() |
| Событие журнала | workflow_failed |
workflow_cancelled |
Пример: отмена с подтверждением
Обычно перед отменой проверяют статус workflow:
PHP
$status = Queuety::workflow_status( $workflow_id );
if ( null === $status ) {
throw new \RuntimeException( 'Workflow not found.' );
}
if ( 'running' === $status->status->value || 'paused' === $status->status->value ) {
Queuety::cancel_workflow( $workflow_id );
}