# Tutorial 2: Service Tasks Call external services (microservices, HTTP APIs, GraphQL, RabbitMQ) from within a workflow. Handle failures and timeouts gracefully. ## Concepts Introduced - `.Call()` — invoke a transport with payload and optional response capture - Address types — `LegacyRabbit`, `Microservice`, `Http`, `Graphql`, `Rabbit` - `resultKey` — store the service response in workflow state - `whenFailure` / `whenTimeout` — recovery branches - `WorkflowHandledBranchAction.Complete` — shorthand for "complete on error" - `timeoutSeconds` — per-step timeout override (default: 1 hour) ## Key Points - Each `Call` step executes synchronously within the workflow - The per-step timeout wraps the entire call including transport-level retries - Transport timeouts (30s default) control individual attempt duration - If no failure/timeout handler is defined, the error propagates and the signal pump retries ## Variants - [C# Fluent DSL](csharp/) - [Canonical JSON](json/) ## Next [Tutorial 3: Decisions](../03-decisions/) — branch workflow logic based on conditions.