Gå til indhold

Eksport og afspilning af workflows

Queuety kan eksportere et workflows komplette kørselshistorik til et portabelt format JSON og afspille den i et andet miljø. Det er nyttigt til at genskabe produktionsfejl lokalt, flytte workflows mellem miljøer og udføre revision.

Eksport af et workflow

PHP API

Kald Queuety::export_workflow() med workflow-ID'et. Den returnerer et JSON-serialiserbart array:

PHP
use Queuety\Queuety;

$data = Queuety::export_workflow( $workflow_id );

Sådan får du direkte en JSON-streng:

PHP
$json = json_encode( $data, JSON_PRETTY_PRINT );
file_put_contents( '/tmp/workflow-42.json', $json );

CLI

Shell
wp queuety workflow export <id> [--output=<file>]
Valgmulighed Beskrivelse
<id> Workflow-id (påkrævet)
--output=<file> Filsti, hvor JSON skal skrives. Standard er stdout.
Shell
# Print to stdout
wp queuety workflow export 42

# Write to a file
wp queuety workflow export 42 --output=/tmp/workflow-42.json

Afspilning af et workflow

PHP API

Kald Queuety::replay_workflow() med eksportdataene. Den returnerer det nye workflow-ID:

PHP
use Queuety\Queuety;

$json = file_get_contents( '/tmp/workflow-42.json' );
$data = json_decode( $json, true );

$new_id = Queuety::replay_workflow( $data );

CLI

Shell
wp queuety workflow replay <file>
Valgmulighed Beskrivelse
<file> Sti til den eksporterede JSON-fil (påkrævet)
Shell
wp queuety workflow replay /tmp/workflow-42.json
# Success: Workflow replayed. New workflow ID: 85.

Struktur for JSON

Eksporten indeholder hele workflowtilstanden, tilhørende jobs, sporhændelser, logposter, gemte signaler, artefakter, bidder og eventuelle rækker for ventende workflowafhængigheder:

JSON
{
    "workflow": {
        "id": 42,
        "name": "generate_report",
        "status": "failed",
        "state": { "user_id": 1, "_steps": [...], "_queue": "default" },
        "current_step": 2,
        "total_steps": 4,
        "parent_workflow_id": null,
        "parent_step_index": null,
        "started_at": "2026-03-28 10:00:00",
        "completed_at": null,
        "failed_at": "2026-03-28 10:05:00",
        "error_message": "API timeout",
        "deadline_at": null
    },
    "jobs": [
        {
            "id": 100,
            "queue": "default",
            "handler": "App\\Handlers\\FetchDataHandler",
            "payload": {},
            "status": "completed",
            "attempts": 1,
            "max_attempts": 3,
            "step_index": 0
        }
    ],
    "events": [
        {
            "id": 1,
            "job_id": 100,
            "step_index": 0,
            "step_name": "fetchData",
            "step_type": "single",
            "handler": "App\\Handlers\\FetchDataHandler",
            "event": "step_completed",
            "input": { "user_id": 1 },
            "output": { "records": 150 },
            "state_before": { "user_id": 1 },
            "state_after": { "user_id": 1, "records": 150 },
            "context": { "source": "api" },
            "error": null,
            "duration_ms": 230,
            "created_at": "2026-03-28 10:00:01"
        }
    ],
    "logs": [
        {
            "id": 1,
            "event": "workflow_started",
            "handler": "generate_report",
            "created_at": "2026-03-28 10:00:00"
        }
    ],
    "signals": [],
    "artifacts": [],
    "chunks": [],
    "wait_dependencies": [],
    "exported_at": "2026-03-28T12:00:00+00:00",
    "queuety_version": "0.22.0"
}

Nogle felter er forkortet i eksemplet ovenfor. Den faktiske eksport indeholder alle sporkolonner fra hver hændelsesrække.

Workfloweksporter bevarer også workflowmetadata såsom definition_version, definition_hash og idempotency_key, hvis de blev angivet i den oprindelige kørsel.

Sådan fungerer afspilning

Når du afspiller et eksporteret workflow:

  1. Der oprettes en ny workflowrække med den eksporterede tilstand og trindefinitioner
  2. Det nye workflows navn er {original_name}_replay_{timestamp}
  3. Historiske workflowhændelser og logge indsættes igen i det nye miljø
  4. Gemte signaler og rækker med ventende workflowafhængigheder afspilles som historisk tilstand
  5. Hvis det oprindelige workflow stadig var running, sættes det aktuelle trin i kø til behandling. Repeat- og start_workflows()-trin sættes ikke i kø igen, så en afspilning, der stopper ved et af dem, forbliver running uden et job (#17)
  6. Hvis det oprindelige workflow var waiting_for_signal, waiting_for_workflows, paused, failed, cancelled eller completed, bevares den status i det afspillede workflow

Det afspillede workflow får et nyt ID og kører uafhængigt. Det påvirker ikke originalen.

Ved afspilning af waiting_for_workflows genskabes de eksporterede afhængighedsrækker med de samme workflow-ID'er. Det er nyttigt til revision og i miljøer, hvor afhængighedsworkflowsene også findes, men afhængigheds-ID'er tilpasses ikke automatisk på tværs af miljøer.

Anvendelsesområder

Genskab produktionsfejl

Eksportér et fejlet workflow fra produktion, og afspil det lokalt:

Shell
# On production
wp queuety workflow export 42 --output=/tmp/workflow-42.json

# Copy the file to your local environment

# On local
wp queuety workflow replay /tmp/workflow-42.json

Det afspillede workflow har præcis samme tilstand og trindefinitioner. Kørende workflows sætter det aktuelle trin i kø igen, så du kan fortsætte kørslen fra det sted, hvor de slap. Workflows, der er sat på pause eller venter, genskabes i den blokerede tilstand, så du kan undersøge dem.

Flyt workflows mellem miljøer

Flyt et workflow fra staging til produktion eller omvendt ved at eksportere og afspille det:

Shell
# On staging
wp queuety workflow export 15 --output=workflow.json

# On production
wp queuety workflow replay workflow.json

Revision og arkivering

Eksportér fuldførte workflows til langtidsopbevaring eller overholdelse af regler. Filen JSON indeholder hele kørselshistorikken, herunder input, output, tilstand før og efter, tidsdata og fejloplysninger.

PHP
$data = Queuety::export_workflow( $workflow_id );
// Store $data in your archive system, S3, etc.