{"id":21393206,"url":"https://github.com/camunda-community-hub/eze","last_synced_at":"2025-07-13T18:31:39.465Z","repository":{"id":36968027,"uuid":"394624396","full_name":"camunda-community-hub/eze","owner":"camunda-community-hub","description":"Embedded Zeebe Engine","archived":false,"fork":false,"pushed_at":"2024-10-25T07:16:34.000Z","size":872,"stargazers_count":24,"open_issues_count":12,"forks_count":7,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-06-09T19:50:20.521Z","etag":null,"topics":["embedded","in-memory","testing","zeebe"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/camunda-community-hub.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-08-10T11:18:36.000Z","updated_at":"2025-03-13T14:40:01.000Z","dependencies_parsed_at":"2023-11-23T23:21:23.575Z","dependency_job_id":"d8f80248-f83c-4643-b31c-d9bf07a2c439","html_url":"https://github.com/camunda-community-hub/eze","commit_stats":null,"previous_names":[],"tags_count":22,"template":false,"template_full_name":"camunda-community-hub/maven-template","purl":"pkg:github/camunda-community-hub/eze","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camunda-community-hub%2Feze","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camunda-community-hub%2Feze/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camunda-community-hub%2Feze/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camunda-community-hub%2Feze/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/camunda-community-hub","download_url":"https://codeload.github.com/camunda-community-hub/eze/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/camunda-community-hub%2Feze/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265186708,"owners_count":23724724,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["embedded","in-memory","testing","zeebe"],"created_at":"2024-11-22T14:09:58.485Z","updated_at":"2025-07-13T18:31:38.982Z","avatar_url":"https://github.com/camunda-community-hub.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Embedded Zeebe engine\n\n[![](https://img.shields.io/badge/Lifecycle-Unmaintained-lightgrey)](https://github.com/Camunda-Community-Hub/community/blob/main/extension-lifecycle.md#Unmaintained-)\n[![Community extension badge](https://img.shields.io/badge/Community%20Extension-An%20open%20source%20community%20maintained%20project-FF4700)](https://github.com/camunda-community-hub/community)\n![Compatible with: Camunda Platform 8](https://img.shields.io/badge/Compatible%20with-Camunda%20Platform%208-0072Ce)\n\n\u003e [!IMPORTANT]\n\u003e This community extension is **unmaintained** and outdated. It doesn't support new Camunda versions.\n\u003e\n\u003e Thank you to all [contributors](https://github.com/camunda-community-hub/eze/graphs/contributors) for making it a great extension. :tada:\n\nA lightweight version of [Zeebe](https://github.com/camunda-cloud/zeebe) from [Camunda](https://camunda.com). It bundles Zeebe's workflow engine including some required parts to a library that can be used by other projects. Some parts of Zeebe, like clustering, are not included or are replaced with simpler implementations, for example with an In-Memory database.   \n\n\u003e The project was created as part of the Camunda Summer Hackdays 2021.\n\n**Features:**\n\n* Support Zeebe clients and exporters\n* Read and write records from and to an in-memory log stream\n* Time-Travel API\n\n## Usage\n\n### Maven \n\nAdd one of the following dependency to your project (i.e. Maven pom.xml):\n\nFor the embedded engine:\n\n```\n\u003cdependency\u003e\n  \u003cgroupId\u003eorg.camunda.community\u003c/groupId\u003e\n  \u003cartifactId\u003eeze\u003c/artifactId\u003e\n  \u003cversion\u003e0.3.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nFor the JUnit5 extension: \n\n```\n\u003cdependency\u003e\n  \u003cgroupId\u003eorg.camunda.community\u003c/groupId\u003e\n  \u003cartifactId\u003eeze-junit-extension\u003c/artifactId\u003e\n  \u003cversion\u003e0.3.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nNote that the library is written in Kotlin. In general, it works for all JVM languages, like Java. However, it may work best with Kotlin. \n\n#### Bootstrap the Engine\n\nUse the factory to create a new engine.  \n\n```\nval engine: ZeebeEngine = EngineFactory.create()\nengine.start()\n\n// ...\nengine.stop()\n```\n\n#### Connect a Zeebe Client\n\nThe engine includes an embedded gRPC gateway to support interactions with Zeebe clients. \n\nUse the factory method of the engine to create a preconfigured Zeebe client. \n\n```\nval client: ZeebeClient = engine.createClient()\n```\n\nOr, create your own Zeebe client using the provided gateway address from the engine.\n\n```\nval client: ZeebeClient = ZeebeClient.newClientBuilder()\n  .gatewayAddress(engine.getGatewayAddress())\n  .usePlaintext()\n  .build()\n```\n\n#### Read Records from the Log Stream\n\nThe engine stores all records (i.e. commands, events, rejections) on a append-only log stream.\n\nUse the engine to read the records. It provides different methods based on the value type (e.g. `processRecords()`, `processInstanceRecords()`). \n\n```                \nengine.processRecords().forEach { record -\u003e\n    // ...\n}\n\nengine.processInstanceRecords()\n    .withElementType(BpmnElementType.PROCESS)\n    .withIntent(ProcessInstanceIntent.ELEMENT_ACTIVATED)\n    .forEach { record -\u003e  \n        // ...\n    }               \n```\n\nFor testing or debugging, you can print the records. \n\n```\n// print the most relevant parts of the records\nengine.records().print(compact = true)\n\n// print as raw JSON records\nengine.records().print(compact = false)\n```\n\n#### Time Travel\n\nThe engine has an internal clock that is used for timer events or other time-dependent operations.\n\nUse the engine clock to manipulate the time.\n\n```\nengine.clock().increaseTime(timeToAdd = Duration.ofMinutes(5))\n```\n\n#### Exporters\n\nThe engine supports Zeebe exporters. An exporter reads the records from the log stream and can export them to an external system.\n\nUse the factory to create a new engine and register exporters.  \n\n```\nval engine: ZeebeEngine = EngineFactory.create(exporters = listOf(HazelcastExporter()))\n```\n\n#### JUnit5 Extension\n\nThe project contains a JUnit5 extension to write tests more smoothly.  \n\nAdd the `@EmbeddedZeebeEngine` annotation to your test class. The extension injects fields of the following types to interact with the engine:\n* `ZeebeEngine`\n* `ZeebeClient`\n* `RecordStreamSource`\n* `ZeebeEngineClock`\n\n```\n@EmbeddedZeebeEngine\nclass ProcessTest {\n\n  // the extension injects the fields before running the test   \n  lateinit var client: ZeebeClient\n  lateinit var recordStream: RecordStreamSource\n  lateinit var clock: ZeebeEngineClock\n\n  @Test\n  fun `should complete process`() {\n    // given\n    val process = Bpmn.createExecutableProcess(\"process\")\n        .startEvent()\n        .endEvent()\n        .done()\n\n    client.newDeployCommand()\n        .addProcessModel(process, \"process.bpmn\")\n        .send()\n        .join()\n\n    // when\n    val processInstanceResult = client.newCreateInstanceCommand()\n        .bpmnProcessId(\"process\")\n        .latestVersion()\n        .variables(mapOf(\"x\" to 1))\n        .withResult()\n        .send()\n        .join()\n\n    // then\n    assertThat(processInstanceResult.variablesAsMap)\n        .containsEntry(\"x\", 1)\n  }\n```\n\n### Docker\n\nEZE can be run via docker. The benefits over running a normal Zeebe docker image are, the reductions of dependencies and components, which should make start up and execution much more performant.\n\n```sh\ndocker run -p 26500:26500 -it ghcr.io/camunda-community-hub/eze:0.8.1\n```\n\nYou can check with zbctl whether it works to access the engine.\n\n```sh\n$ zbctl status --insecure --address 0.0.0.0:26500\nCluster size: 1\nPartitions count: 1\nReplication factor: 1\nGateway version: A.B.C\nBrokers:\n  Broker 0 - 0.0.0.0:26500\n    Version: X.Y.Z\n    Partition 1 : Leader, Healthy\n```\n\nThe usage of the Docker container is currently quite limited, since the client/user has no access to the log. The log is currently not exposed. Furthermore, it is not yet possible to configure an exporter, but hopefully soon.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcamunda-community-hub%2Feze","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcamunda-community-hub%2Feze","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcamunda-community-hub%2Feze/lists"}