Signal
Signal дозволяють спричиняти події у workflow ззовні. Це корисно для реакції на зовнішні події, втручання людини в процес чи повідомлення про завершення зовнішнього завдання. Для повторюваних упорядкованих вхідних даних зі стійким просуванням курсора використовуйте потоки повідомлень.
Очікування іменованих signal
Workflow безпосередньо викликає await('signal-name'). Наступна прийнята команда signal із цією назвою продовжує запуск та повертає детерміноване значення призупиненому workflow.
use Workflow\V2\Attributes\Signal;
use Workflow\V2\Attributes\Type;
use Workflow\V2\Workflow;
use function Workflow\V2\await;
#[Type('order-approval')]
#[Signal('approved-by', [
['name' => 'approvedBy', 'type' => 'string'],
])]
final class OrderApprovalWorkflow extends Workflow
{
public function handle(): array
{
$approvedBy = await('approved-by');
return [
'approved_by' => $approvedBy,
'workflow_id' => $this->workflowId(),
'run_id' => $this->runId(),
];
}
}
Надішліть signal із PHP за публічним ідентифікатором екземпляра:
use Workflow\V2\WorkflowStub;
$workflow = WorkflowStub::load('order-123');
$result = $workflow->attemptSignalWithArguments('approved-by', [
'approvedBy' => 'Taylor',
]);
$result->accepted(); // true
$result->outcome(); // "signal_received"
$result->commandId(); // Durable signal-command id
$result->instanceId(); // "order-123"
Поведінка signal:
- Заздалегідь оголосіть кожну назву зовнішнього signal через повторюваний атрибут класу
#[Signal('signal-name')]. За потреби додайте впорядкований контракт параметрів. - Команди signal спрямовані на публічний ідентифікатор екземпляра workflow, а не запуску, тому ланцюжки continue-as-new зберігають той самий публічний маршрут signal.
- За наявності контракту параметрів прийом відхиляє некоректні дані як
rejected_invalid_argumentsіз машинозчитуванимиvalidation_errors. - Без контракту
await('name')повертаєtrue, якщо аргументів немає, єдиний аргумент, якщо передано один, або повний масив аргументів, якщо передано кілька. - Невідомі назви signal відхиляються як
rejected_unknown_signal. Signal для закритого чи незапущеного екземпляра відхиляються якrejected_not_activeабоrejected_not_started.
Важливо: функцію await() слід використовувати лише у workflow, а не в activity.
Для очікування умов, коли предикат над стійким станом має стати істинним, дивіться очікування умов. Для await із тайм-аутом дивіться signal + timer. Для повторюваних потоків inbox/outbox дивіться потоки повідомлень.
Запуск цього шаблону
Workflow, що запускається через webhook у Sample App, — виконуваний приклад шаблону очікування іменованого signal із цієї сторінки:
php artisan app:webhook
App\Workflows\Webhooks\WebhookWorkflow запускається через вхідний HTTP webhook і зупиняється на await('ready') до надходження відповідного signal. Відкрийте Waterline під час очікування: подія WorkflowExecutionSignaled з’явиться в момент прийняття signal.