Ugrás a tartalomhoz

Munkafolyamat megszakítása

A munkafolyamatok programozottan vagy a(z) CLI segítségével szakíthatók meg. Megszakításkor a(z) Queuety a(z) cancelled értékre állítja az állapotát, eltemeti a függőben lévő vagy feldolgozás alatt álló feladatokat, és futtat egy választható takarító kezelőt.

Regisztrációs takarító kezelő

Használja a on_cancel() metódust a munkafolyamat-építőn egy olyan osztály regisztrálásához, amely a munkafolyamat megszakításakor fut le. A kezelőosztálynak implementálnia kell egy handle( array $state ): void metódust.

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

A takarító kezelő megkapja a munkafolyamat nyilvános állapotát (az összes olyan kulcsot, amely nem _ kezdetű):

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

Megszakítás a PHP használatával

Hívja meg a Queuety::cancel_workflow() metódust a munkafolyamat azonosítójával:

PHP
Queuety::cancel_workflow( $workflow_id );

Ez a metódus:

  1. Zárolja a munkafolyamat sorát
  2. Beállítja a munkafolyamat állapotát erre: cancelled
  3. Eltemeti a munkafolyamathoz tartozó összes függőben lévő és feldolgozás alatt álló feladatot a "Workflow cancelled" üzenettel
  4. Naplóz egy workflow_cancelled eseményt, majd véglegesíti a tranzakciót
  5. Fordított sorrendben futtatja a befejezett lépések kompenzációit (ha a compensate_with() használatával regisztráltak ilyet)
  6. Futtatja a on_cancel takarító kezelőt (ha regisztráltak ilyet)

RuntimeException kivétel keletkezik, ha a munkafolyamat már completed vagy cancelled állapotú.

Megszakítás a CLI használatával

Shell
wp queuety workflow cancel <id>
Beállítás Leírás
<id> Megszakítandó munkafolyamat-azonosító (kötelező)
Shell
wp queuety workflow cancel 42

Mi történik megszakításkor

Amikor egy munkafolyamatot megszakítanak:

  • Állapot: cancelled értékre változik
  • Lépéskompenzációk: fordított befejezési sorrendben futnak le, ha a compensate_with() segítségével csatolta őket
  • Takarító kezelő: a munkafolyamat cancelled állapotúra jelölése után fut le
  • Függőben lévő feladatok: a munkafolyamathoz tartozók azonnal eltemetésre kerülnek
  • Feldolgozás alatt álló feladatok: a munkafolyamathoz tartozók eltemetésre kerülnek; a folyamatban lévő kezelő befejezésekor a kimenete eldobásra kerül, és a munkafolyamat nem lép tovább
  • Befejezett feladatok: a korábbi lépések feladatai változatlanok maradnak
  • Naplóbejegyzés: workflow_cancelled eseménnyel kerül rögzítésre

Megszakítva vagy sikertelenül

Szempont Sikertelen Megszakítva
Kiváltó ok Egy lépés kimeríti az újrapróbálkozási kísérleteit A cancel_workflow() kifejezett meghívása
Állapot failed cancelled
Újrapróbálható Igen, a retry_workflow() segítségével, kivéve, ha a munkafolyamatot már kompenzálták Nem
Takarító kezelő Nem fut le Lefut, ha a on_cancel() segítségével regisztrálták
Naplóesemény workflow_failed workflow_cancelled

Példa: megszakítás megerősítéssel

Gyakori minta, hogy megszakítás előtt ellenőrzi a munkafolyamat állapotát:

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