{"id":19891389,"url":"https://github.com/lightbend/kalix-demo-digitaltwin-java","last_synced_at":"2025-09-18T21:32:09.307Z","repository":{"id":39180392,"uuid":"498452015","full_name":"lightbend/kalix-demo-digitaltwin-java","owner":"lightbend","description":null,"archived":false,"fork":false,"pushed_at":"2024-05-15T19:30:38.000Z","size":3448,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":7,"default_branch":"main","last_synced_at":"2024-11-12T18:18:03.144Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lightbend.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-05-31T18:26:40.000Z","updated_at":"2022-05-31T18:26:52.000Z","dependencies_parsed_at":"2022-08-29T23:52:06.501Z","dependency_job_id":null,"html_url":"https://github.com/lightbend/kalix-demo-digitaltwin-java","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lightbend%2Fkalix-demo-digitaltwin-java","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lightbend%2Fkalix-demo-digitaltwin-java/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lightbend%2Fkalix-demo-digitaltwin-java/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lightbend%2Fkalix-demo-digitaltwin-java/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lightbend","download_url":"https://codeload.github.com/lightbend/kalix-demo-digitaltwin-java/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":233525954,"owners_count":18689407,"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":[],"created_at":"2024-11-12T18:18:07.335Z","updated_at":"2025-09-18T21:32:03.823Z","avatar_url":"https://github.com/lightbend.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# IoT Digital Twin DEMO - Java - Event Sourced\nNot supported by Lightbend in any conceivable way, not open for contributions.\n## Prerequisite\n- Java 11 or later\u003cbr\u003e\n- Apache Maven 3.6 or higher\u003cbr\u003e\n- Kalix:\n    - Register account: [Register](https://console.kalix.io/register)\n    - `kalix` tool installed: [Kalix CLI](https://docs.kalix.io/kalix/install-kalix.html)\n    - `kalix` login\n    -  project `demo` created and set for `kalix`\n- Docker 20.10.8 or higher (engine and client)\u003cbr\u003e\n- Docker Hub account (configured with Docker)\u003cbr\u003e\n  Access to the `gcr.io/kalix-public` container registry\u003cbr\u003e\n  cURL\u003cbr\u003e\n  IDE / editor\u003cbr\u003e\n\n## Generate Java project (terminal)\n\n```\nmvn archetype:generate \\\n-DarchetypeGroupId=io.kalix \\\n-DarchetypeArtifactId=kalix-maven-archetype \\\n-DarchetypeVersion=LATEST\n```\n\n```\nDefine value for property 'groupId': com.example\nDefine value for property 'artifactId': digitaltwin\nDefine value for property 'version' 1.0-SNAPSHOT: :\nDefine value for property 'package' com.example: : com.example.digitaltwin\n```\n\n## Import in IDE\n\n## Cleanup (IDE)\n\nDelete:\u003cbr\u003e\n`src/main/proto/com/example/shoppingcart/counter_api.proto`\u003cbr\u003e\n`src/main/proto/com/example/shoppingcart/domain/counter_domain.proto`\n\n## API descriptor - endpoints (IDE)\n\nNote: For code snippet insertion use command+J (MAC)\u003cbr\u003e\n\n1. Create file `digitaltwin_api.proto` in `src/main/proto/com/example/digitaltwin` folder.\u003cbr\u003e\n2. Edit `src/main/proto/com/example/digitaltwin/digitaltwin_api.proto` in IDE \u003cbr\u003e\n3. Insert header snippet: `aheader`\n4. Insert commands snippet: `acmd`\n5. Insert state snippet: `astate`\n6. Insert service snippet: `asrv`\n7. Add functions to service snippet (place cursor inside brackets `service DigitalTwinService { }`): `afunc`\n\n## API descriptor - domain (IDE)\n\n1. Create file `digitaltwin_domain.proto` in `src/main/proto/com/example/digitaltwin/domain` folder.\u003cbr\u003e\n2. Edit `src/main/proto/com/example/digitaltwin/domain/digitaltwin_domain.proto` in IDE \u003cbr\u003e\n3. Insert header snippet: `dheader`\n4. Insert events snippet: `devts`\n5. Insert state snippet: `dstate`\n\n## API descriptor - codegen annotations (IDE)\n\n1. Edit `src/main/proto/com/example/digitaltwin/digitaltwin_api.proto`\n2. Insert codegen annotations (place cursor under `service DigitalTwinService {` ): `acodegen`\n\n## Codegen\n\n1. Code generation (terminal):\n```\nmvn compile\n```\n2. Refresh project (IDE)\n3. Trigger Maven sync (IDE)\n\n\n## Business logic implementation (IDE)\n\n1. Edit `src/main/java/com/example/digitaltwin/domain/DigitalTwin` class\n2. Delete class body\n3. Insert code snippet (delete everything under constructor): `eall`\n\n## Implement unit test\n1. Edit `src/test/java/com/example/digitaltwin/domain/DigitalTwinTest` class\n2. Delete class body\n3. Insert code snippet (delete everything under constructor): `ut`\n\n## Run unit test (terminal)\n```\nmvn test\n```\n\n## Implement integration test (IDE)\n1. Edit `src/it/java/com/example/digitaltwin/DigitalTwinIntegrationTest` class\n2. Delete everything under the constructor\n3. Insert code snippet (delete everything under constructor): `it`\n\n## Run integration test (terminal)\n```\nmvn -Pit verify\n```\n## Run locally\n??\n\n## Package \u0026 deploy\n1. Edit `pom.xml` and update `my-docker-repo` in `\u003cdockerImage\u003emy-docker-repo/${project.artifactId}\u003c/dockerImage\u003e`\n2. Execute in terminal:\n```\nmvn deploy\n```\n\n## Expose service\n```\nkalix services expose digitaltwin\n```\n```\nService 'digitaltwin' was successfully exposed at: winter-bonus-0316.eu-central-1.kalix.app\n```\nNote: HOSTNAME to use for external access\n\n## Test service in production\n1. Create digital twin\n```\ncurl -XPOST -d '{\n  \"name\": \"DT1\",\n  \"metric_value_alert_threshold\": \"10\"\n}' https://winter-bonus-0316.eu-central-1.kalix.app/digitaltwin/1/create -H \"Content-Type: application/json\"\n```\n2. Add OK metric\n```\ncurl -XPOST -d '{\n  \"metric_value\": \"5\"\n}' https://winter-bonus-0316.eu-central-1.kalix.app/digitaltwin/1/add-metric -H \"Content-Type: application/json\"\n```\n3. Get cart\n```\ncurl -XGET https://winter-bonus-0316.eu-central-1.kalix.app/digitaltwin/1 -H \"Content-Type: application/json\"\n```\n4. Add ALERT metric\n```\ncurl -XPOST -d '{\n  \"metric_value\": \"11\"\n}' https://winter-bonus-0316.eu-central-1.kalix.app/digitaltwin/1/add-metric -H \"Content-Type: application/json\"\n```\n5. Get cart\n```\ncurl -XGET https://winter-bonus-0316.eu-central-1.kalix.app/digitaltwin/1 -H \"Content-Type: application/json\"\n```\n\n## Eventing (optional)\n\n1. Create file `digitaltwin_topic.proto` in `src/main/proto/com/example/digitaltwin` folder.\u003cbr\u003e\n2. Edit `src/main/proto/com/example/digitaltwin/digitaltwin_topic.proto` in IDE \u003cbr\u003e\n3. Insert header snippet: `theader`\n4. Insert events snippet: `tevts`\n5. Insert service snippet: `tsrv`\n\n8. Code generation (terminal):\n```\nmvn compile\n```\n9. Refresh project (IDE)\n10. Trigger Maven sync (IDE)\n11. Edit `src/main/java/com/example/digitaltwin/DigitalTwinToTopicAction` class\n12. Delete class body\n13. Insert code snippet (delete everything under constructor): `tall`\n\n\n## Copy-paste list\n```\nmvn archetype:generate \\\n-DarchetypeGroupId=io.kalix \\\n-DarchetypeArtifactId=kalix-maven-archetype \\\n-DarchetypeVersion=LATEST\n```\n```\ncom.example\n```\n```\ndigitaltwin\n```\n```\ncom.example.digitaltwin\n```\n```\ndigitaltwin_api.proto\n```\n```\ndigitaltwin_domain.proto\n```\n```\nmvn compile\n```\n```\nmvn test\n```\n```\nmvn -Pit verify\n```\n```\nmvn deploy\n```\n```\ncurl -XPOST -d '{\n  \"name\": \"DT1\",\n  \"metric_value_alert_threshold\": \"10\"\n}' https://winter-bonus-0316.eu-central-1.kalix.app/digitaltwin/1/create -H \"Content-Type: application/json\"\n```\n```\ncurl -XPOST -d '{\n  \"metric_value\": \"5\"\n}' https://winter-bonus-0316.eu-central-1.kalix.app/digitaltwin/1/add-metric -H \"Content-Type: application/json\"\n```\n```\ncurl -XGET https://winter-bonus-0316.eu-central-1.kalix.app/digitaltwin/1 -H \"Content-Type: application/json\"\n```\n```\ncurl -XPOST -d '{\n  \"metric_value\": \"11\"\n}' https://winter-bonus-0316.eu-central-1.kalix.app/digitaltwin/1/add-metric -H \"Content-Type: application/json\"\n```\n```\ndigitaltwin_topic.proto\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flightbend%2Fkalix-demo-digitaltwin-java","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flightbend%2Fkalix-demo-digitaltwin-java","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flightbend%2Fkalix-demo-digitaltwin-java/lists"}