{"id":51598793,"url":"https://github.com/operaton/operaton-examples","last_synced_at":"2026-07-11T20:01:20.920Z","repository":{"id":365833276,"uuid":"1272039041","full_name":"operaton/operaton-examples","owner":"operaton","description":"Curated, bullet-proof Operaton example projects — dual Maven/Gradle builds, Testcontainers ITs, Docker Compose","archived":false,"fork":false,"pushed_at":"2026-06-30T12:53:28.000Z","size":4532,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-30T14:25:57.109Z","etag":null,"topics":["bpmn","bpmn-io","dmn","operaton"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/operaton.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-17T08:27:09.000Z","updated_at":"2026-06-30T12:53:28.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/operaton/operaton-examples","commit_stats":null,"previous_names":["operaton/operaton-examples"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/operaton/operaton-examples","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/operaton%2Foperaton-examples","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/operaton%2Foperaton-examples/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/operaton%2Foperaton-examples/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/operaton%2Foperaton-examples/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/operaton","download_url":"https://codeload.github.com/operaton/operaton-examples/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/operaton%2Foperaton-examples/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35374165,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-11T02:00:05.354Z","response_time":104,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bpmn","bpmn-io","dmn","operaton"],"created_at":"2026-07-11T20:01:20.077Z","updated_at":"2026-07-11T20:01:20.907Z","avatar_url":"https://github.com/operaton.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Operaton Examples\n\nA curated catalog of minimal, production-quality example projects for\n[Operaton](https://operaton.org) — the open-source BPMN process engine.\nEvery example is self-contained, builds with **both** Maven Wrapper and\nGradle Wrapper, ships a Docker Compose setup for local exploration, and is\nverified end-to-end by **Testcontainers** integration tests: building an\nexample means testing its processes against real integrations.\n\n## Requirements\n\n| Tool | Version |\n|---|---|\n| JDK | 21 |\n| Docker | any recent version (required for tests and local run) |\n| Distribution images (`operaton/tomcat`, `operaton/wildfly`, `operaton/operaton`) | `2.1.1` |\n| `operaton-keycloak-run` (plugin) | `2.1.0` |\n| AWS SDK v2 | 2.29.0 |\n| Apache PDFBox | 3.0.7 |\n\nPinned stack (all examples): Spring Boot **4.1.0**, Operaton **2.1.1**,\nMaven Wrapper **3.9.12**, Gradle Wrapper **9.2.0**, PostgreSQL **16**.\n\n## Using an example\n\n```bash\ncd examples/core-examples/getting-started\ndocker compose up -d --wait # start PostgreSQL (and example-specific services)\n./mvnw spring-boot:run      # or: ./gradlew bootRun\n# Cockpit/Tasklist: http://localhost:8080  (demo/demo)\n./mvnw verify               # or: ./gradlew build — runs Testcontainers ITs\n```\n\n## Catalog\n\n### Core Examples\n\n| Example | Demonstrates |\n|---|---|\n| [getting-started](examples/core-examples/getting-started) | Embedded engine, service task delegate, user task, exclusive gateway |\n| [service-tasks](examples/core-examples/service-tasks) | Java delegates, expression delegates, BpmnError, job retry |\n| [external-task-worker](examples/core-examples/external-task-worker) | External task pattern, long-polling worker, topic subscription |\n| [user-task-forms](examples/core-examples/user-task-forms) | User tasks, embedded forms, task lifecycle, form variables |\n| [dmn-decision](examples/core-examples/dmn-decision) | DMN decision tables, DRD, decision evaluation, business rule task |\n| [message-events](examples/core-examples/message-events) | Message start event, intermediate message catch, business-key correlation |\n| [timer-events](examples/core-examples/timer-events) | Timer boundary event (SLA escalation), job executor API, testing timers |\n| [error-compensation](examples/core-examples/error-compensation) | BPMN compensation (saga pattern), compensation handlers, BpmnError trigger |\n| [multi-instance](examples/core-examples/multi-instance) | Parallel multi-instance user tasks, collection loop, completion condition |\n| [integration-rest](examples/core-examples/integration-rest) | REST delegate via RestTemplate, 4xx→BpmnError, WireMock Testcontainers |\n| [integration-mail](examples/core-examples/integration-mail) | Spring Mail in delegates, Mailpit Testcontainers for SMTP + REST assertions |\n| [integration-kafka](examples/core-examples/integration-kafka) | Kafka listener starts process, delegate publishes result, Awaitility assertions |\n| [call-activity](examples/core-examples/call-activity) | Process composition via call activity, variable in/out mappings, child process history |\n| [signal-events](examples/core-examples/signal-events) | Signal broadcast vs. message point-to-point, intermediate catch/throw, multi-subscriber |\n| [event-subprocess](examples/core-examples/event-subprocess) | Non-interrupting signal audit subprocess, interrupting error handler subprocess |\n| [inclusive-gateway](examples/core-examples/inclusive-gateway) | Inclusive (OR) gateway — multiple concurrent paths, join waits for all active tokens |\n| [async-continuation](examples/core-examples/async-continuation) | asyncBefore transaction boundaries, manual job execution, failedJobRetryTimeCycle |\n\n### Advanced Engine Features\n\n| Example | Demonstrates |\n|---|---|\n| [engine-plugin](examples/advanced-features/engine-plugin) | Custom `AbstractProcessEnginePlugin` with `BpmnParseListener` injecting `TaskListener` for audit logging |\n| [job-retry-profile](examples/advanced-features/job-retry-profile) | `failedJobRetryTimeCycle`, custom retry profiles, observing and controlling retry counts |\n| [command-interceptor](examples/advanced-features/command-interceptor) | `CommandInterceptor` wrapping all engine API calls for auditing (name + duration) |\n| [process-migration](examples/advanced-features/process-migration) | `MigrationPlan` API to migrate running instances between process definition versions |\n| [spin-json](examples/advanced-features/spin-json) | JSON-typed process variables via Operaton Spin — store and retrieve Java objects as JSON |\n| [xslt-script-task](examples/advanced-features/xslt-script-task) | XSLT transformation in a Groovy script task using javax.xml.transform |\n| [multi-tenancy](examples/advanced-features/multi-tenancy) | Tenant-identifier multi-tenancy: shared engine, isolated deployments and instances per tenant |\n| [bpmn-model-api-parse](examples/advanced-features/bpmn-model-api-parse) | Programmatic inspection of deployed BPMN models using the BPMN Model API |\n| [bpmn-model-api-generate](examples/advanced-features/bpmn-model-api-generate) | Create and deploy BPMN processes programmatically without XML authoring |\n| [unit-testing](examples/advanced-features/unit-testing) | Fast isolated unit tests with `ProcessEngineExtension` + H2, complemented by Testcontainers ITs |\n\n### Platform Integration\n\n| Example | Demonstrates |\n|---|---|\n| [integration-connectors](examples/platform-integration/integration-connectors) | HTTP connector (declarative, no Java delegate) + custom Connector SPI |\n| [runtime-quarkus](examples/platform-integration/runtime-quarkus) | Embedded engine in Quarkus/CDI (no Spring Boot) |\n| [distribution-tomcat](examples/platform-integration/distribution-tomcat) | Process-application WAR deployed into `operaton/tomcat` shared-engine container |\n| [distribution-wildfly](examples/platform-integration/distribution-wildfly) | Process-application WAR deployed into `operaton/wildfly` shared-engine container |\n\n### Use Cases\n\n| Use Case | Process | Demonstrates |\n|---|---|---|\n| [leave-request](examples/use-cases/leave-request) | Employee leave approval | Timer escalation (non-interrupting), VacationBalanceService, SQL schema init |\n| [loan-application](examples/use-cases/loan-application) | Loan origination | REST credit scoring, DMN risk assessment, Spring Mail notifications |\n| [incident-management](examples/use-cases/incident-management) | IT support ticket | Signal escalation boundary, timer SLA boundary, 4-swimlane BPMN, REST integration |\n| [order-fulfillment](examples/use-cases/order-fulfillment) | E-commerce order | Error boundary on payment, async continuation, compensation, WireMock inventory/payment stubs |\n| [candidate-screening](examples/use-cases/candidate-screening) | AI recruiting screening | LLM scoring + email generation via HTTP connector, LLM-driven confidence gateway, human-in-the-loop on borderline, calendar slot query, WireMock IT |\n| [insurance-claim](examples/use-cases/insurance-claim) | Insurance damage claim | Event-based gateway (message vs timer race), parallel fraud check and damage appraisal, DMN settlement with FIRST hit policy |\n| [travel-booking](examples/use-cases/travel-booking) | Travel booking SAGA | BPMN transaction subprocess, cancel end event, cancel boundary event, automatic compensation rollback |\n| [complaint-resolution](examples/use-cases/complaint-resolution) | Customer complaint | Escalation events: non-interrupting throw + boundary (parallel approval), interrupting end event + boundary (specialist reroute) |\n| [employee-onboarding](examples/use-cases/employee-onboarding) | Employee HR onboarding | Call activity orchestration: parallel MI for equipment provisioning, single call activity for system access, in/out variable mapping |\n| [procurement-collaboration](examples/use-cases/procurement-collaboration) | Buyer ↔ Supplier procurement | Two-pool collaboration, three correlated messages, async continuation decoupling |\n| [supply-chain-tracking](examples/use-cases/supply-chain-tracking) | Shipment tracking | Event-based gateway, async Kafka message correlation by business key, P7D timer re-arm |\n| [expense-reimbursement](examples/use-cases/expense-reimbursement) | Vision LLM receipt verification | Multimodal vision LLM via delegate, three-way match verification, FIRST-hit DMN, LLM-drafted email |\n\n## Anatomy of every example\n\n```mermaid\nflowchart LR\n    subgraph example [examples/name]\n        BPMN[\"BPMN/DMN models\u003cbr/\u003e(operaton namespace, full DI)\"]\n        APP[\"Spring Boot app\u003cbr/\u003e(delegates, config)\"]\n        IT[\"Integration tests\u003cbr/\u003e(Testcontainers)\"]\n        DC[\"docker-compose.yml\u003cbr/\u003e(local exploration)\"]\n        RM[\"README\u003cbr/\u003e(Mermaid diagrams, walkthrough)\"]\n    end\n    BPMN --\u003e APP\n    APP --\u003e IT\n    IT --\u003e|\"PostgreSQL + real\u003cbr/\u003eexternal systems\"| TC[(containers)]\n    DC --\u003e|same services| TC\n```\n\n## Quality bar\n\nEvery example satisfies [docs/EXAMPLE_STANDARDS.md](docs/EXAMPLE_STANDARDS.md)\n— the definition of done covering modeling, testing, documentation and dual\nbuilds. CI builds every example with both build systems on every push.\n\n## Contributing (humans and AI agents)\n\nAI agents: start with [AGENTS.md](AGENTS.md).\nHumans: same rules — see the review checklist in\n[docs/EXAMPLE_STANDARDS.md](docs/EXAMPLE_STANDARDS.md#10-review-checklist-copy-into-every-example-pr).\n\n## BPMN Concept Reference\n\nQuick lookup: which example demonstrates each BPMN construct.\n\n### BPMN Concepts\n\n| BPMN Concept | Example(s) | Notes |\n|---|---|---|\n| Service task | \u003cul\u003e\u003cli\u003e[getting-started](examples/core-examples/getting-started)\u003c/li\u003e\u003cli\u003e[service-tasks](examples/core-examples/service-tasks)\u003c/li\u003e\u003c/ul\u003e | Java delegate, Spring bean, expression |\n| User task | [user-task-forms](examples/core-examples/user-task-forms) | Forms, candidate groups |\n| Script task | [service-tasks](examples/core-examples/service-tasks) | JavaScript / Groovy inline |\n| Business rule task (DMN) | \u003cul\u003e\u003cli\u003e[dmn-decision](examples/core-examples/dmn-decision)\u003c/li\u003e\u003cli\u003e[insurance-claim](examples/use-cases/insurance-claim)\u003c/li\u003e\u003c/ul\u003e | FEEL expressions, hit policies |\n| Exclusive gateway (XOR) | \u003cul\u003e\u003cli\u003e[getting-started](examples/core-examples/getting-started)\u003c/li\u003e\u003cli\u003e[dmn-decision](examples/core-examples/dmn-decision)\u003c/li\u003e\u003c/ul\u003e | Default flow, condition expressions |\n| **Parallel gateway (AND)** | **[insurance-claim](examples/use-cases/insurance-claim)** | AND-split / AND-join, concurrent branches |\n| **Event-based gateway** | **[insurance-claim](examples/use-cases/insurance-claim)** | Race between message and timer |\n| Inclusive gateway (OR) | [inclusive-gateway](examples/core-examples/inclusive-gateway) | OR-split / OR-join |\n| Message start event | \u003cul\u003e\u003cli\u003e[message-events](examples/core-examples/message-events)\u003c/li\u003e\u003cli\u003e[procurement-collaboration](examples/use-cases/procurement-collaboration)\u003c/li\u003e\u003c/ul\u003e | Start by message correlation |\n| Timer start event | [timer-events](examples/core-examples/timer-events) | Cron, cycle, duration |\n| Message intermediate catch | \u003cul\u003e\u003cli\u003e[message-events](examples/core-examples/message-events)\u003c/li\u003e\u003cli\u003e[insurance-claim](examples/use-cases/insurance-claim)\u003c/li\u003e\u003cli\u003e[procurement-collaboration](examples/use-cases/procurement-collaboration)\u003c/li\u003e\u003c/ul\u003e | Correlation by business key |\n| Timer intermediate catch | \u003cul\u003e\u003cli\u003e[timer-events](examples/core-examples/timer-events)\u003c/li\u003e\u003cli\u003e[insurance-claim](examples/use-cases/insurance-claim)\u003c/li\u003e\u003c/ul\u003e | ISO-8601 duration variable |\n| Signal intermediate catch/throw | [signal-events](examples/core-examples/signal-events) | Broadcast signal |\n| Error boundary event | [error-compensation](examples/core-examples/error-compensation) | Interrupting and non-interrupting |\n| Compensation | \u003cul\u003e\u003cli\u003e[error-compensation](examples/core-examples/error-compensation)\u003c/li\u003e\u003cli\u003e[travel-booking](examples/use-cases/travel-booking)\u003c/li\u003e\u003c/ul\u003e | Manual throw (error-compensation) vs. transaction-driven (travel-booking) |\n| **Transaction subprocess** | **[travel-booking](examples/use-cases/travel-booking)** | All-or-nothing SAGA; cancel end event triggers auto-compensation |\n| **Cancel event (end + boundary)** | **[travel-booking](examples/use-cases/travel-booking)** | Cancel end event inside transaction + cancel boundary on transaction |\n| Multi-instance | \u003cul\u003e\u003cli\u003e[multi-instance](examples/core-examples/multi-instance)\u003c/li\u003e\u003cli\u003e[employee-onboarding](examples/use-cases/employee-onboarding)\u003c/li\u003e\u003c/ul\u003e | Sequential and parallel sub-tasks; collection-driven parallel MI call activity |\n| **Call activity** | \u003cul\u003e\u003cli\u003e[call-activity](examples/core-examples/call-activity)\u003c/li\u003e\u003cli\u003e[employee-onboarding](examples/use-cases/employee-onboarding)\u003c/li\u003e\u003c/ul\u003e | Sub-process reuse, in/out variable mapping, parallel multi-instance over collection |\n| Event sub-process | [event-subprocess](examples/core-examples/event-subprocess) | Error- and message-triggered |\n| External task | [external-task-worker](examples/core-examples/external-task-worker) | Worker API, long polling |\n| Async continuation | \u003cul\u003e\u003cli\u003e[async-continuation](examples/core-examples/async-continuation)\u003c/li\u003e\u003cli\u003e[procurement-collaboration](examples/use-cases/procurement-collaboration)\u003c/li\u003e\u003c/ul\u003e | `asyncBefore`, exclusive job lock |\n| **Escalation events** | **[complaint-resolution](examples/use-cases/complaint-resolution)** | Non-interrupting throw + boundary (parallel), interrupting end event + boundary (cancel) |\n| **Collaboration / message flow (two pools)** | **[procurement-collaboration](examples/use-cases/procurement-collaboration)** | Two process definitions communicating via message correlation within one engine |\n| **Cross-instance correlation key** | **[procurement-collaboration](examples/use-cases/procurement-collaboration)** | `processInstanceVariableEquals()` routes messages to the correct instance by `requestId` |\n\n### Integrations\n\n| Integration | Example(s) |\n|---|---|\n| REST (Spring WebClient) | core-examples/integration-rest |\n| Mail (Jakarta Mail) | core-examples/integration-mail |\n| Kafka | core-examples/integration-kafka |\n| Operaton Connectors | platform-integration/integration-connectors |\n| Micrometer / Prometheus | approval-sla-metrics |\n| Keycloak identity provider | platform-integration/integration-keycloak |\n| Vision LLM (Ollama) | [expense-reimbursement](examples/use-cases/expense-reimbursement) |\n\n### Platforms / Runtimes\n\n| Platform | Example(s) |\n|---|---|\n| Spring Boot (embedded) | core-examples/getting-started, all use-cases, approval-sla-metrics, … |\n| Quarkus (embedded) | platform-integration/runtime-quarkus |\n| Tomcat (shared engine) | platform-integration/distribution-tomcat |\n| WildFly (shared engine) | platform-integration/distribution-wildfly |\n| Flowset Control + SSO (Keycloak) | operaton-example-projects / operaton-flowset-sso |\n| Operaton Run + Keycloak plugin (custom image) | platform-integration/integration-keycloak |\n\n## License\n\n[Apache-2.0](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foperaton%2Foperaton-examples","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foperaton%2Foperaton-examples","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foperaton%2Foperaton-examples/lists"}