コンテンツへスキップ

ワークフローのキャンセル

ワークフローはプログラムまたはCLI経由でキャンセルできます。ワークフローをキャンセルすると、Queuetyはそのステータスをcancelledに設定し、保留中または処理中のジョブをすべて保留状態に移し、任意でクリーンアップハンドラーを実行します。

クリーンアップハンドラーの登録

ワークフロービルダーでon_cancel()を使い、ワークフローのキャンセル時に実行するクラスを登録します。ハンドラークラスは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 ] );

クリーンアップハンドラーには、ワークフローの公開状態(_で始まらないすべてのキー)が渡されます。

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経由でのキャンセル

ワークフローIDを指定してQueuety::cancel_workflow()を呼び出します。

PHP
Queuety::cancel_workflow( $workflow_id );

このメソッドは次の処理を行います。

  1. ワークフローの行をロックする
  2. ワークフローのステータスをcancelledに設定する
  3. 「Workflow cancelled」というメッセージを付けて、そのワークフローの保留中および処理中のジョブをすべて保留状態に移す
  4. workflow_cancelledイベントを記録してコミットする
  5. 完了済みステップの補償処理を逆順に実行する(compensate_with()経由で登録されている場合)
  6. on_cancelクリーンアップハンドラーを実行する(登録されている場合)

ワークフローがすでにcompletedまたはcancelledの場合、RuntimeExceptionがスローされます。

CLI経由でのキャンセル

シェル
wp queuety workflow cancel <id>
オプション 説明
<id> キャンセルするワークフローID(必須)
シェル
wp queuety workflow cancel 42

キャンセル時の動作

ワークフローをキャンセルすると、次の処理が行われます。

  • ステータスがcancelledに変わる
  • ステップの補償処理は、compensate_with()で設定している場合、完了した順序の逆順に実行される
  • クリーンアップハンドラーは、ワークフローの行がcancelledに設定された後に実行される
  • 保留中のジョブは直ちに保留状態に移される
  • 処理中のジョブは保留状態に移される。実行中のハンドラーが終了すると、その出力は破棄され、ワークフローは次に進まない
  • 完了済みのジョブはそのまま残る
  • ログエントリーにイベントworkflow_cancelledが記録される

キャンセルと失敗の違い

項目 失敗 キャンセル
トリガー ステップの再試行回数を使い切る cancel_workflow()の明示的な呼び出し
ステータス failed cancelled
再試行可能 はい。ワークフローの補償処理がまだ行われていない場合はretry_workflow()経由で可能 いいえ
クリーンアップハンドラー 呼び出されない on_cancel()経由で登録されている場合に呼び出される
ログイベント workflow_failed workflow_cancelled

例:確認してからキャンセルする

よくあるパターンは、キャンセル前にワークフローのステータスを確認することです。

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 );
}