Files
wehub-resource-sync a9cd7750f4
CI / unit-test (push) Has been cancelled
CI / detect-changes (push) Has been cancelled
CI / build (push) Has been cancelled
Publish docs via GitHub Pages / Deploy docs (push) Has been cancelled
CI / test-harness (push) Has been cancelled
CI / generate-e2e-matrix (push) Has been cancelled
CI / e2e (push) Has been cancelled
CI / build-ui (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
UI v2 Integration CI / E2E (Integration) (push) Has been cancelled
UI v2 CI / Lint, Format & Test (push) Has been cancelled
UI v2 CI / E2E (Mocked) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:37:56 +08:00

178 lines
5.3 KiB
Markdown

---
description: "Event Handlers Lab — hands-on tutorial for publishing events and triggering Conductor workflows with event handlers."
---
# Events and Event Handlers
In this exercise, we shall:
* Publish an Event to Conductor using `Event` task.
* Subscribe to Events, and perform actions:
* Start a Workflow
* Complete Task
Conductor supports eventing with two Interfaces:
* [Event Task](../../documentation/configuration/workflowdef/systemtasks/event-task.md)
* [Event Handlers](../../documentation/configuration/eventhandlers.md)
## Create Workflow Definitions
Let's create two workflows:
* `test_workflow_for_eventHandler` which will have an `Event` task to start another workflow, and a `WAIT` System task that will be completed by an event.
* `test_workflow_startedBy_eventHandler` which will have an `Event` task to generate an event to complete `WAIT` task in the above workflow.
Send `POST` requests to `/metadata/workflow` endpoint with below payloads:
```json
{
"name": "test_workflow_for_eventHandler",
"description": "A test workflow to start another workflow with EventHandler",
"version": 1,
"tasks": [
{
"name": "test_start_workflow_event",
"taskReferenceName": "start_workflow_with_event",
"type": "EVENT",
"sink": "conductor"
},
{
"name": "test_task_tobe_completed_by_eventHandler",
"taskReferenceName": "test_task_tobe_completed_by_eventHandler",
"type": "WAIT"
}
]
}
```
```json
{
"name": "test_workflow_startedBy_eventHandler",
"description": "A test workflow which is started by EventHandler, and then goes on to complete task in another workflow.",
"version": 1,
"tasks": [
{
"name": "test_complete_task_event",
"taskReferenceName": "complete_task_with_event",
"inputParameters": {
"sourceWorkflowId": "${workflow.input.sourceWorkflowId}"
},
"type": "EVENT",
"sink": "conductor"
}
]
}
```
### Event Tasks in Workflow
`EVENT` task is a System task, and we shall define it just like other Tasks in Workflow, with `sink` parameter. Also, `EVENT` task doesn't have to be registered before using in Workflow. This is also true for the `WAIT` task.
Hence, we will not be registering any tasks for these workflows.
### Events are sent, but they're not handled (yet)
Once you try to start `test_workflow_for_eventHandler` workflow, you would notice that the event is sent successfully, but the second worflow `test_workflow_startedBy_eventHandler` is not started. We have sent the Events, but we also need to define `Event Handlers` for Conductor to take any `actions` based on the Event. Let's create `Event Handlers`.
## Create Event Handlers
Event Handler definitions are pretty much like Task or Workflow definitions. We start by name:
```json
{
"name": "test_start_workflow"
}
```
Event Handler should know the Queue it has to listen to. This should be defined in `event` parameter.
When using Conductor queues, define `event` with format:
```conductor:{workflow_name}:{taskReferenceName}```
And when using SQS, define with format:
```sqs:{my_sqs_queue_name}```
```json
{
"name": "test_start_workflow",
"event": "conductor:test_workflow_for_eventHandler:start_workflow_with_event"
}
```
Event Handler can perform a list of actions defined in `actions` array parameter, for this particular `event` queue.
```json
{
"name": "test_start_workflow",
"event": "conductor:test_workflow_for_eventHandler:start_workflow_with_event",
"actions": [
"<insert-actions-here>"
],
"active": true
}
```
Let's define `start_workflow` action. We shall pass the name of workflow we would like to start. The `start_workflow` parameter can use any of the values from the general [Start Workflow Request](../../documentation/api/startworkflow.md). Here we are passing in the workflowId, so that the Complete Task Event Handler can use it.
```json
{
"action": "start_workflow",
"start_workflow": {
"name": "test_workflow_startedBy_eventHandler",
"input": {
"sourceWorkflowId": "${workflowInstanceId}"
}
}
}
```
Send a `POST` request to `/event` endpoint:
```json
{
"name": "test_start_workflow",
"event": "conductor:test_workflow_for_eventHandler:start_workflow_with_event",
"actions": [
{
"action": "start_workflow",
"start_workflow": {
"name": "test_workflow_startedBy_eventHandler",
"input": {
"sourceWorkflowId": "${workflowInstanceId}"
}
}
}
],
"active": true
}
```
Similarly, create another Event Handler to complete task.
```json
{
"name": "test_complete_task_event",
"event": "conductor:test_workflow_startedBy_eventHandler:complete_task_with_event",
"actions": [
{
"action": "complete_task",
"complete_task": {
"workflowId": "${sourceWorkflowId}",
"taskRefName": "test_task_tobe_completed_by_eventHandler"
}
}
],
"active": true
}
```
## Summary
After wiring all of the above, starting the `test_workflow_for_eventHandler` should:
1. Start `test_workflow_startedBy_eventHandler` workflow.
2. Sets `test_task_tobe_completed_by_eventHandler` WAIT task `IN_PROGRESS`.
3. `test_workflow_startedBy_eventHandler` event task would publish an Event to complete the WAIT task above.
4. Both the workflows would move to `COMPLETED` state.