Trama

Examples

Create and Store a Definition

curl -X POST http://localhost:8080/sagas/definitions \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "order-saga",
    "version": "v1",
    "failureHandling": {
      "type": "retry",
      "maxAttempts": 3,
      "delayMillis": 500
    },
    "steps": [
      {
        "name": "reserve-inventory",
        "up": {
          "url": "http://inventory/reserve",
          "verb": "POST",
          "body": {
            "orderId": "{{payload.orderId}}"
          }
        },
        "down": {
          "url": "http://inventory/release",
          "verb": "POST",
          "body": {
            "orderId": "{{payload.orderId}}"
          }
        }
      }
    ]
  }'

Robust Definition Using All Main Fields

This sample covers: backoff, multi-step flow, headers, body templates, explicit successStatusCodes, and success/failure callbacks.

{
  "name": "order-fulfillment",
  "version": "v2",
  "failureHandling": {
    "type": "backoff",
    "maxAttempts": 5,
    "initialDelayMillis": 200,
    "maxDelayMillis": 5000,
    "multiplier": 2.0,
    "jitterRatio": 0.2
  },
  "steps": [
    {
      "name": "reserve-inventory",
      "up": {
        "url": "http://inventory/api/v1/reservations",
        "verb": "POST",
        "headers": {
          "X-Correlation-Id": "{{payload.correlationId}}",
          "Content-Type": "application/json"
        },
        "body": {
          "orderId": "{{payload.orderId}}",
          "items": "{{payload.items}}"
        },
        "successStatusCodes": [200, 201, 202]
      },
      "down": {
        "url": "http://inventory/api/v1/reservations/{{step.0.up.body.reservationId}}/cancel",
        "verb": "POST",
        "headers": {
          "X-Correlation-Id": "{{payload.correlationId}}"
        },
        "body": {
          "reason": "compensation"
        },
        "successStatusCodes": [200, 204]
      }
    },
    {
      "name": "charge-payment",
      "up": {
        "url": "http://payments/api/v1/charges",
        "verb": "POST",
        "headers": {
          "Authorization": "Bearer {{payload.paymentToken}}",
          "X-Correlation-Id": "{{payload.correlationId}}"
        },
        "body": {
          "orderId": "{{payload.orderId}}",
          "amount": "{{payload.amount}}",
          "reservationId": "{{step.0.up.body.reservationId}}"
        },
        "successStatusCodes": [200, 201]
      },
      "down": {
        "url": "http://payments/api/v1/charges/{{step.1.up.body.chargeId}}/refund",
        "verb": "POST",
        "headers": {
          "Authorization": "Bearer {{payload.paymentToken}}",
          "X-Correlation-Id": "{{payload.correlationId}}"
        },
        "body": {
          "orderId": "{{payload.orderId}}",
          "reason": "compensation"
        },
        "successStatusCodes": [200, 202]
      }
    }
  ],
  "onSuccessCallback": {
    "url": "http://notifications/api/v1/order-success",
    "verb": "POST",
    "headers": {
      "Content-Type": "application/json"
    },
    "body": {
      "orderId": "{{payload.orderId}}",
      "chargeId": "{{step.1.up.body.chargeId}}"
    },
    "successStatusCodes": [200, 202, 204]
  },
  "onFailureCallback": {
    "url": "http://notifications/api/v1/order-failed",
    "verb": "POST",
    "headers": {
      "Content-Type": "application/json"
    },
    "body": {
      "orderId": "{{payload.orderId}}",
      "message": "saga failed or compensated"
    },
    "successStatusCodes": [200, 202, 204]
  }
}

Run Stored Definition

curl -X POST http://localhost:8080/sagas/definitions/order-saga/v1/run \
  -H 'Content-Type: application/json' \
  -d '{"payload": {"orderId": "ord-123", "amount": 99.5}}'

Run Inline Definition

curl -X POST http://localhost:8080/sagas/run \
  -H 'Content-Type: application/json' \
  -d '{"definition": {"name":"inline","version":"v1","failureHandling":{"type":"retry","maxAttempts":1,"delayMillis":200},"steps":[...]},"payload":{}}'

Template Example

{
  "url": "http://service/charge?reservation={{step.0.up.body.id}}",
  "verb": "POST",
  "body": {
    "amount": "{{payload.amount}}"
  }
}

Load & Demo Scripts