diff --git a/docs/src-static/robots.txt b/docs/src-static/robots.txt
index b4abd0373..cc3626454 100644
--- a/docs/src-static/robots.txt
+++ b/docs/src-static/robots.txt
@@ -1,4 +1,5 @@
Sitemap: https://doc.akka.io/sitemap.xml
+Sitemap: https://doc.akka.io/sitemap-libraries.xml
User-agent: *
# docs snapshots
diff --git a/docs/src-static/sitemap-libraries.xml b/docs/src-static/sitemap-libraries.xml
new file mode 100644
index 000000000..938fb5391
--- /dev/null
+++ b/docs/src-static/sitemap-libraries.xml
@@ -0,0 +1,55 @@
+
+
+
+ https://doc.akka.io/libraries/index.html
+ https://doc.akka.io/libraries/guide/
+
+
+ https://doc.akka.io/libraries/akka-core/current
+ https://doc.akka.io/api/akka-core/current
+ https://doc.akka.io/japi/akka-core/current
+
+ https://doc.akka.io/libraries/akka-dependencies/current
+
+ https://doc.akka.io/libraries/akka-diagnostics/current
+
+ https://doc.akka.io/libraries/akka-distributed-cluster/current
+
+ https://doc.akka.io/libraries/akka-edge/current
+
+ https://doc.akka.io/libraries/akka-enhancements/current
+ https://doc.akka.io/api/akka-enhancements/current
+ https://doc.akka.io/japi/akka-enhancements/current
+
+ https://doc.akka.io/libraries/akka-grpc/current
+ https://doc.akka.io/api/akka-grpc/current
+
+ https://doc.akka.io/libraries/akka-http/current
+ https://doc.akka.io/api/akka-http/current
+ https://doc.akka.io/japi/akka-http/current
+
+ https://doc.akka.io/libraries/akka-management/current
+ https://doc.akka.io/api/akka-management/current
+
+ https://doc.akka.io/libraries/akka-persistence-cassandra/current
+ https://doc.akka.io/api/akka-persistence-cassandra/current
+
+ https://doc.akka.io/libraries/akka-persistence-dynamodb/current
+ https://doc.akka.io/api/akka-persistence-dynamodb/current
+
+ https://doc.akka.io/libraries/akka-persistence-jdbc/current
+ https://doc.akka.io/api/akka-persistence-jdbc/current
+
+ https://doc.akka.io/libraries/akka-persistence-r2dbc/current
+ https://doc.akka.io/api/akka-persistence-r2dbc/current
+
+ https://doc.akka.io/libraries/akka-projection/current
+ https://doc.akka.io/api/akka-projection/current
+
+ https://doc.akka.io/libraries/alpakka/current
+ https://doc.akka.io/api/alpakka/current
+
+ https://doc.akka.io/libraries/alpakka-kafka/current
+ https://doc.akka.io/api/alpakka-kafka/current
+
+
diff --git a/docs/src-static/sitemap.xml b/docs/src-static/sitemap.xml
deleted file mode 100644
index e3a54daa0..000000000
--- a/docs/src-static/sitemap.xml
+++ /dev/null
@@ -1,1008 +0,0 @@
-
-
-
- https://doc.akka.io/libraries/index.html
- https://doc.akka.io/libraries/guide/
-
-
- https://doc.akka.io/libraries/akka-core/current
- https://doc.akka.io/api/akka-core/current
- https://doc.akka.io/japi/akka-core/current
-
- https://doc.akka.io/libraries/akka-dependencies/current
-
- https://doc.akka.io/libraries/akka-diagnostics/current
-
- https://doc.akka.io/libraries/akka-distributed-cluster/current
-
- https://doc.akka.io/libraries/akka-edge/current
-
- https://doc.akka.io/libraries/akka-enhancements/current
- https://doc.akka.io/api/akka-enhancements/current
- https://doc.akka.io/japi/akka-enhancements/current
-
- https://doc.akka.io/libraries/akka-grpc/current
- https://doc.akka.io/api/akka-grpc/current
-
- https://doc.akka.io/libraries/akka-http/current
- https://doc.akka.io/api/akka-http/current
- https://doc.akka.io/japi/akka-http/current
-
- https://doc.akka.io/libraries/akka-management/current
- https://doc.akka.io/api/akka-management/current
-
- https://doc.akka.io/libraries/akka-persistence-cassandra/current
- https://doc.akka.io/api/akka-persistence-cassandra/current
-
- https://doc.akka.io/libraries/akka-persistence-dynamodb/current
- https://doc.akka.io/api/akka-persistence-dynamodb/current
-
- https://doc.akka.io/libraries/akka-persistence-jdbc/current
- https://doc.akka.io/api/akka-persistence-jdbc/current
-
- https://doc.akka.io/libraries/akka-persistence-r2dbc/current
- https://doc.akka.io/api/akka-persistence-r2dbc/current
-
- https://doc.akka.io/libraries/akka-projection/current
- https://doc.akka.io/api/akka-projection/current
-
- https://doc.akka.io/libraries/alpakka/current
- https://doc.akka.io/api/alpakka/current
-
- https://doc.akka.io/libraries/alpakka-kafka/current
- https://doc.akka.io/api/alpakka-kafka/current
-
-
-
- https://doc.akka.io/concepts/architecture-model.html
-
-
- https://doc.akka.io/concepts/declarative-effects.html
-
-
- https://doc.akka.io/concepts/deployment-model.html
-
-
- https://doc.akka.io/concepts/development-process.html
-
-
- https://doc.akka.io/concepts/index.html
-
-
- https://doc.akka.io/concepts/multi-region.html
-
-
- https://doc.akka.io/concepts/saga-patterns.html
-
-
- https://doc.akka.io/concepts/state-model.html
-
-
- https://doc.akka.io/index.html
-
-
- https://doc.akka.io/java/access-control.html
-
-
- https://doc.akka.io/java/auth-with-jwts.html
-
-
- https://doc.akka.io/java/build-your-first-application.html
-
-
- https://doc.akka.io/java/component-and-service-calls.html
-
-
- https://doc.akka.io/java/consuming-producing.html
-
-
- https://doc.akka.io/java/dev-best-practices.html
-
-
- https://doc.akka.io/java/errors-and-failures.html
-
-
- https://doc.akka.io/java/event-sourced-entities.html
-
-
- https://doc.akka.io/java/http-endpoints.html
-
-
- https://doc.akka.io/java/index.html
-
-
- https://doc.akka.io/java/key-value-entities.html
-
-
- https://doc.akka.io/java/running-locally.html
-
-
- https://doc.akka.io/java/samples.html
-
-
- https://doc.akka.io/java/serialization.html
-
-
- https://doc.akka.io/java/setup-and-dependency-injection.html
-
-
- https://doc.akka.io/java/streaming.html
-
-
- https://doc.akka.io/java/timed-actions.html
-
-
- https://doc.akka.io/java/views.html
-
-
- https://doc.akka.io/java/workflows.html
-
-
- https://doc.akka.io/libraries/index.html
-
-
- https://doc.akka.io/operations/index.html
-
-
- https://doc.akka.io/operations/integrating-cicd/github-actions.html
-
-
- https://doc.akka.io/operations/integrating-cicd/index.html
-
-
- https://doc.akka.io/operations/observability-and-monitoring/index.html
-
-
- https://doc.akka.io/operations/observability-and-monitoring/metrics.html
-
-
- https://doc.akka.io/operations/observability-and-monitoring/observability-exports.html
-
-
- https://doc.akka.io/operations/observability-and-monitoring/traces.html
-
-
- https://doc.akka.io/operations/observability-and-monitoring/view-logs.html
-
-
- https://doc.akka.io/operations/operator-best-practices.html
-
-
- https://doc.akka.io/operations/organizations/billing.html
-
-
- https://doc.akka.io/operations/organizations/index.html
-
-
- https://doc.akka.io/operations/organizations/manage-users.html
-
-
- https://doc.akka.io/operations/organizations/regions.html
-
-
- https://doc.akka.io/operations/projects/broker-aiven.html
-
-
- https://doc.akka.io/operations/projects/broker-aws-msk.html
-
-
- https://doc.akka.io/operations/projects/broker-confluent.html
-
-
- https://doc.akka.io/operations/projects/broker-google-pubsub.html
-
-
- https://doc.akka.io/operations/projects/container-registries.html
-
-
- https://doc.akka.io/operations/projects/create-project.html
-
-
- https://doc.akka.io/operations/projects/external-container-registries.html
-
-
- https://doc.akka.io/operations/projects/index.html
-
-
- https://doc.akka.io/operations/projects/manage-project-access.html
-
-
- https://doc.akka.io/operations/projects/message-brokers.html
-
-
- https://doc.akka.io/operations/projects/secrets.html
-
-
- https://doc.akka.io/operations/regions/index.html
-
-
- https://doc.akka.io/operations/services/data-management.html
-
-
- https://doc.akka.io/operations/services/deploy-service.html
-
-
- https://doc.akka.io/operations/services/index.html
-
-
- https://doc.akka.io/operations/services/invoke-service.html
-
-
- https://doc.akka.io/operations/services/note-about-push.html
-
-
- https://doc.akka.io/operations/services/view-data.html
-
-
- https://doc.akka.io/reference/api-docs.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_auth_container-registry_clear-cached-token.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_auth_container-registry_configure.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_auth_container-registry_credentials.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_auth_container-registry_install-helper.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_auth_container-registry.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_auth_current-login.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_auth_login.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_auth_logout.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_auth_signup.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_auth_tokens_create.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_auth_tokens_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_auth_tokens_revoke.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_auth_tokens.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_auth_use-token.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_auth.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_completion.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_config_clear-cache.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_config_clear.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_config_current-context.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_config_delete-context.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_config_get-organization.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_config_get-project.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_config_get.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_config_list-contexts.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_config_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_config_rename-context.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_config_set.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_config_use-context.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_config.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_container-registry_delete-image.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_container-registry_list-images.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_container-registry_list-tags.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_container-registry_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_container-registry_print.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_container-registry_push.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_container-registry.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_docker_add-credentials.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_docker_list-credentials.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_docker_remove-credentials.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_docker.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_docs.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_local_console.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_local_services_components_get-state.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_local_services_components_get-workflow.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_local_services_components_list-events.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_local_services_components_list-ids.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_local_services_components_list-timers.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_local_services_components_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_local_services_components.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_local_services_connectivity.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_local_services_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_local_services_views_describe.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_local_services_views_drop.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_local_services_views_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_local_services_views.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_local_services.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_local.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_logs.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_organizations_auth_add_openid.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_organizations_auth_add.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_organizations_auth_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_organizations_auth_remove.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_organizations_auth_show.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_organizations_auth_update_openid.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_organizations_auth_update.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_organizations_auth.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_organizations_get.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_organizations_invitations_cancel.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_organizations_invitations_create.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_organizations_invitations_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_organizations_invitations.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_organizations_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_organizations_users_add-binding.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_organizations_users_delete-binding.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_organizations_users_list-bindings.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_organizations_users.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_organizations.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_config_get_broker.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_config_get.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_config_set_broker.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_config_set.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_config_unset_broker.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_config_unset.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_config.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_delete.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_get.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_hostnames_add.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_hostnames_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_hostnames_remove.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_hostnames.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_new.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_apply.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_config_traces.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_config.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_edit.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_export.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_get.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_set_default_akka-console.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_set_default_google-cloud.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_set_default_otlp.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_set_default_splunk-hec.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_set_default.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_set_logs_google-cloud.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_set_logs_otlp.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_set_logs_splunk-hec.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_set_logs.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_set_metrics_google-cloud.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_set_metrics_otlp.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_set_metrics_prometheus.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_set_metrics_splunk-hec.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_set_metrics.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_set_traces_google-cloud.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_set_traces_otlp.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_set_traces.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_set.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_unset_default.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_unset_logs.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_unset_metrics.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_unset_traces.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability_unset.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_observability.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_open.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_regions_add.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_regions_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_regions_set-primary.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_regions.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_tokens_create.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_tokens_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_tokens_revoke.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_tokens.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects_update.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_projects.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_quickstart_download.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_quickstart_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_quickstart.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_regions_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_regions.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_roles_add-binding.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_roles_delete-binding.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_roles_invitations_delete.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_roles_invitations_invite-user.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_roles_invitations_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_roles_invitations.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_roles_list-bindings.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_roles_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_roles.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_routes_create.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_routes_delete.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_routes_edit.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_routes_export.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_routes_get.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_routes_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_routes_update.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_routes.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_secrets_create_asymmetric.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_secrets_create_generic.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_secrets_create_symmetric.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_secrets_create_tls-ca.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_secrets_create_tls.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_secrets_create.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_secrets_delete.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_secrets_get.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_secrets_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_secrets.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_apply.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_components_get-state.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_components_get-workflow.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_components_list-events.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_components_list-ids.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_components_list-timers.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_components_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_components.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_connectivity.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_data_cancel-task.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_data_export.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_data_get-task.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_data_import.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_data_list-tasks.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_data_watch-task.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_data.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_delete.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_deploy.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_edit.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_export.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_expose.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_get.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_jwts_add.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_jwts_generate.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_jwts_list-algorithms.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_jwts_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_jwts_remove.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_jwts_update.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_jwts.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_logging_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_logging_set-level.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_logging_unset-level.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_logging.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_pause.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_proxy.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_restart.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_restore.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_resume.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_unexpose.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_views_describe.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_views_drop.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_views_list.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services_views.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_services.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka_version.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/akka.html
-
-
- https://doc.akka.io/reference/cli/akka-cli/index.html
-
-
- https://doc.akka.io/reference/cli/command-completion.html
-
-
- https://doc.akka.io/reference/cli/index.html
-
-
- https://doc.akka.io/reference/cli/installation.html
-
-
- https://doc.akka.io/reference/cli/using-cli.html
-
-
- https://doc.akka.io/reference/descriptors/observability-descriptor.html
-
-
- https://doc.akka.io/reference/descriptors/route-descriptor.html
-
-
- https://doc.akka.io/reference/descriptors/service-descriptor.html
-
-
- https://doc.akka.io/reference/glossary.html
-
-
- https://doc.akka.io/reference/index.html
-
-
- https://doc.akka.io/reference/migration-guide.html
-
-
- https://doc.akka.io/reference/release-notes.html
-
-
- https://doc.akka.io/reference/release-notes/2022-10-26-akka-22.10-released.html
-
-
- https://doc.akka.io/reference/release-notes/2023-05-16-akka-23.5-released.html
-
-
- https://doc.akka.io/reference/release-notes/2023-10-31-akka-23.10-released.html
-
-
- https://doc.akka.io/reference/release-notes/2024-05-17-akka-24.05-released.html
-
-
- https://doc.akka.io/reference/release-notes/2024-10-02-akka-2.9.6-released.html
-
-
- https://doc.akka.io/reference/release-notes/2024-10-30-akka-24.10-released.html
-
-
- https://doc.akka.io/reference/security-announcements/akka-2017-02-10.html
-
-
- https://doc.akka.io/reference/security-announcements/akka-async-dns-2023-31442.html
-
-
- https://doc.akka.io/reference/security-announcements/akka-camel-cve-2017-5643.html
-
-
- https://doc.akka.io/reference/security-announcements/akka-cve-2018-16115.html
-
-
- https://doc.akka.io/reference/security-announcements/akka-cve-2023-45865.html
-
-
- https://doc.akka.io/reference/security-announcements/akka-http-2016-09-30.html
-
-
- https://doc.akka.io/reference/security-announcements/akka-http-2017-01-23.html
-
-
- https://doc.akka.io/reference/security-announcements/akka-http-cve-2018-16131.html
-
-
- https://doc.akka.io/reference/security-announcements/akka-http-cve-2021-23339.html
-
-
- https://doc.akka.io/reference/security-announcements/akka-http-cve-2021-42697.html
-
-
- https://doc.akka.io/reference/security-announcements/akka-http-cve-2023-05-15.html
-
-
- https://doc.akka.io/reference/security-announcements/akka-http-cve-2023-44487.html
-
-
- https://doc.akka.io/reference/security-announcements/alpakka-kafka-cve-2023-29471.html
-
-
- https://doc.akka.io/reference/security-announcements/index.html
-
-
- https://doc.akka.io/security/acls.html
-
-
- https://doc.akka.io/security/index.html
-
-
- https://doc.akka.io/security/jwts.html
-
-
- https://doc.akka.io/security/tls-certificates.html
-
-
- https://doc.akka.io/support/community-forum.html
-
-
- https://doc.akka.io/support/email.html
-
-
- https://doc.akka.io/support/frequently-asked-questions.html
-
-
- https://doc.akka.io/support/index.html
-
-
- https://doc.akka.io/support/paid-plans.html
-
-
- https://doc.akka.io/support/platform-status.html
-
-
- https://doc.akka.io/support/request-a-demo.html
-
-
- https://doc.akka.io/support/troubleshooting.html
-
-
-
diff --git a/docs/src/modules/ROOT/pages/index.adoc b/docs/src/modules/ROOT/pages/index.adoc
index 27a0b0692..c771624f4 100644
--- a/docs/src/modules/ROOT/pages/index.adoc
+++ b/docs/src/modules/ROOT/pages/index.adoc
@@ -58,6 +58,7 @@ There are multiple ways to get started with Akka.
* *Learn* the Akka xref:concepts:deployment-model.adoc[] for operators.
* *Learn* the Akka xref:concepts:development-process.adoc[]
* *Start a local development environment* Getting started with Integrated Development Environment (IDE) integration, local debugging, and packing services into images. xref:java:running-locally.adoc[]
-* *Learn how to code with Akka’s components.* Getting Started - xref:java:build-your-first-application.adoc[]
+* *Learn how to implement a "Hello World" service.* xref:java:author-your-first-service.adoc[]
+* *Review a pre-built service implementation.* See some Akka components in the xref:java:shopping-cart-quickstart.adoc[]
* *Setup* CI/CD pipelines, external Docker repositories, external messaging brokers, or 3rd party observability.
See xref:operations:index.adoc[Operating Services] for more information.
diff --git a/docs/src/modules/concepts/pages/architecture-model.adoc b/docs/src/modules/concepts/pages/architecture-model.adoc
index 911929cfb..5145afc66 100644
--- a/docs/src/modules/concepts/pages/architecture-model.adoc
+++ b/docs/src/modules/concepts/pages/architecture-model.adoc
@@ -4,6 +4,7 @@ include::ROOT:partial$include.adoc[]
Akka simplifies application development by allowing developers to focus on their domain models and APIs without worrying about how the data is stored. The architectural model is the key to making this work.
+[#_architecture]
== Architecture
Akka applications are built with an _Onion Architecture_, where services are organized in concentric layers. The core of the application is at the center, with additional layers surrounding it. Each layer has a specific role.
@@ -51,13 +52,14 @@ The outermost layer is the API layer which is how the outside world interacts wi
Having received requests, the `api` layer interacts with the `application` layer through the xref:java:component-and-service-calls.adoc#_component_client[`ComponentClient`] which makes calls in a type safe way. This is the layer boundary that keeps the isolation necessary to remain resilient that is core to an Akka application.
-Additionally this layer is the place for a public event model that a service exposes, often via Kafka or other messaging capabilities. This allows the event driven nature of Akka to be easily integrated into the rest of your information space. In Akka you don't reach into the database to get state, you use the event stream itself.
+Additionally, this layer is the place for a public event model that a service exposes, often via Kafka or other messaging capabilities. This allows the event driven nature of Akka to be easily integrated into the rest of your information space. In Akka you don't reach into the database to get state, you use the event stream itself.
The API layer also uses other annotations to xref:java:access-control.adoc[control access]. For more information on endpoints see xref:java:http-endpoints.adoc[Designing HTTP Endpoints].
+[#_akka_components]
== Akka components
-You use xref:reference:glossary.adoc#component[Akka _Components_] to build your application. These Components are crucial for ensuring responsiveness. Here is a brief overview of each. With the exception of endpoints, Akka components will live in your `application` package.
+You use xref:reference:glossary.adoc#component[Akka _Components_] to build your application. These Components are crucial for ensuring responsiveness. Here is a brief overview of each. Except endpoints, Akka components will live in your `application` package.
The list of components are:
diff --git a/docs/src/modules/concepts/pages/development-process.adoc b/docs/src/modules/concepts/pages/development-process.adoc
index f05d18f0f..c553167bf 100644
--- a/docs/src/modules/concepts/pages/development-process.adoc
+++ b/docs/src/modules/concepts/pages/development-process.adoc
@@ -15,7 +15,7 @@ The main steps in developing a service with Akka are:
[#_create_a_project]
== Create a project
-All services and applications start as a Java project. Akka has a Maven archetype that makes this easier. You will code your service in this project. See xref:java:build-your-first-application.adoc#[] for more details.
+All services and applications start as a Java project. Akka has a Maven archetype that makes this easier. You will code your service in this project. See xref:java:author-your-first-service.adoc[] for more details.
[#_specify_service_interface_and_domain_model]
== Specify service interface and domain model
@@ -32,7 +32,7 @@ The main components of an Akka service are:
We recommend that you separate the service API and Entity domain data model. Separating the service interface and data model in different classes allows you to evolve them independently.
-TIP: Kickstart a project using the xref:java:build-your-first-application.adoc[getting started guide].
+TIP: Kickstart a project using the xref:java:author-your-first-service.adoc[getting started guide].
[#_implement_components]
== Implementing components
diff --git a/docs/src/modules/java/nav.adoc b/docs/src/modules/java/nav.adoc
index 9e3becca9..481f3de40 100644
--- a/docs/src/modules/java/nav.adoc
+++ b/docs/src/modules/java/nav.adoc
@@ -1,5 +1,5 @@
* xref:index.adoc[Developing]
-** xref:build-your-first-application.adoc[Build your first application]
+** xref:author-your-first-service.adoc[Author your first service]
** Components
*** xref:event-sourced-entities.adoc[Event Sourced Entities]
*** xref:key-value-entities.adoc[Key Value Entities]
@@ -21,3 +21,4 @@
*** xref:running-locally.adoc[]
** xref:java:dev-best-practices.adoc[]
** xref:samples.adoc[]
+*** xref:shopping-cart-quickstart.adoc[]
diff --git a/docs/src/modules/java/pages/author-your-first-service.adoc b/docs/src/modules/java/pages/author-your-first-service.adoc
new file mode 100644
index 000000000..b0c0e59bc
--- /dev/null
+++ b/docs/src/modules/java/pages/author-your-first-service.adoc
@@ -0,0 +1,211 @@
+= Author your first Akka service
+:page-aliases: java:build-your-first-application.adoc[]
+
+include::ROOT:partial$include.adoc[]
+
+This guide will walk you through the process of setting up your development environment, generating a project, and implementing a simple "Hello World!" REST service. By the end, you will have a functional HTTP endpoint built with the Akka SDK running locally.
+
+== Overview
+
+The Akka SDK comes with Maven support that enables you to get started quickly. In this guide, you will:
+
+* Use the Akka Maven archetype to generate a skeleton project that follows the recommended onion architecture.
+* Understand how to use the Akka Maven parent POM to define dependencies and run your application locally.
+
+NOTE: If you'd rather skip past this and want to review an already completed application see the xref:java:shopping-cart-quickstart.adoc[].
+
+== Prerequisites
+
+include::ROOT:partial$cloud-dev-prerequisites.adoc[]
+
+
+== Generate and build the skeleton project
+
+The Maven archetype template prompts you to specify the project's group ID, name and version interactively. Run it using the commands shown for your OS.
+
+[sidebar]
+In IntelliJ, you can skip the command line. Open the IDE, select
+*File > New > Project*, and click to activate *Create from archetype*. Use the UI to locate the archetype and fill in the blanks.
+
+Follow these steps to generate and build your project:
+
+. From a command line, create a new Maven project from the Akka archetype in a convenient location:
++
+[.tabset]
+Linux or macOS::
++
+--
+[source,command line, subs="attributes"]
+----
+mvn archetype:generate \
+ -DarchetypeGroupId=io.akka \
+ -DarchetypeArtifactId=akka-javasdk-archetype \
+ -DarchetypeVersion={akka-javasdk-version}
+----
+--
+Windows 10+::
++
+--
+[source,command line, subs="attributes"]
+----
+mvn archetype:generate ^
+ -DarchetypeGroupId=io.akka ^
+ -DarchetypeArtifactId=akka-javasdk-archetype ^
+ -DarchetypeVersion={akka-javasdk-version}
+----
+--
+
+. Fill in
+* groupId: `com.example`
+* artifactId: `helloworld`
+* version: `1.0-SNAPSHOT`
+* package: `helloword`
+
+. Navigate to the new project directory.
+
+. Open it in your preferred IDE / Editor.
+
+. Expand directory `src/main/java/com/example/api` and open the `HelloWorldEndpoint.java` file.
+
+The _Endpoint_ is implemented with:
+
+[source,java]
+.HelloWorldEndpoint.java
+----
+@Acl(allow = @Acl.Matcher(principal = Acl.Principal.INTERNET))
+@HttpEndpoint("/hello")
+public class HelloWorldEndpoint {
+
+ @Get("/")
+ public CompletionStage helloWorld() {
+ return completedStage("Hello World!");
+ }
+}
+----
+
+== Basics
+An _Endpoint_ is a component that creates an externally accessible API. Endpoints are how you expose your services to the outside world. Endpoints can have different protocols and, initially, support HTTP.
+
+HTTP Endpoint components make it possible to conveniently define such APIs accepting and responding in JSON, or dropping down to lower level APIs for ultimate flexibility in what types of data is accepted and returned.
+
+This endpoint is on the path `/hello` and exposes an HTTP GET operation on `/`.
+
+You can also see that there is an _Access Control List_ (ACL) on this endpoint that allows all traffic from the Internet. Without this ACL the service would be unreachable, but you can be very expressive with these ACLs.
+
+== Run locally
+
+Start your service locally:
+
+[source,command line]
+----
+mvn compile exec:java
+----
+
+Once successfully started, any defined endpoints become available at `localhost:9000` and you will see an INFO message that the Akka Runtime has started.
+
+Your "Hello World" service is now running.
+
+In another shell, you can now use `curl` to send requests to this endpoint.
+
+[source, command line]
+----
+curl localhost:9000/hello
+----
+
+Which will reply
+[source]
+----
+Hello World!
+----
+
+
+== Getting more complex
+Endpoints provide the common capabilities you would expect for creating REST services. Here are a few more:
+
+=== Path parameters ===
+The path can also contain one or more parameters, which are extracted and passed to the method:
+
+[source,java]
+.HelloWorldEndpoint.java
+----
+include::example$doc-snippets/src/main/java/com/example/api/ExampleEndpoint.java[tag=basic-path-parameters]
+----
+<1> Path parameter `name` in expression.
+<2> Method parameter named as the one in the expression
+<3> When there are multiple parameters
+<4> The method must accept all the same names in the same order as in the path expression.
+
+Path parameter can be of types `String`, `int`, `long`, `boolean`, `float`, `double`, `short` and `char` as well
+as their `java.lang` class counterparts.
+
+If you add this code above to `HelloWorldEndpoint.java` and restart the service, you can now curl these commands:
+
+[source, command line]
+----
+curl localhost:9000/hello/hello/Bob
+----
+
+[source, command line]
+----
+curl localhost:9000/hello/hello/Bob/30
+----
+
+=== Request body ===
+
+To accept an HTTP JSON body, specify a parameter that is a class that https://github.com/FasterXML/jackson?tab=readme-ov-file#what-is-jackson[Jackson] can deserialize:
+
+[source,java]
+.HelloWorldEndpoint.java
+----
+include::example$doc-snippets/src/main/java/com/example/api/ExampleEndpoint.java[tag=request-body]
+----
+<1> A class that Jackson can serialize and deserialize to JSON
+<2> A parameter of the request body type
+<3> When combining request body with path variables
+<4> The body must come last in the parameter list
+
+Additionally, the request body parameter can be of the following types:
+
+ * `String` for any request with a text content type, the body decoded into a string
+ * `java.util.List` where `T` is a type Jackson can deserialize, accepts a JSON array.
+ * `akka.http.javadsl.model.HttpEntity.Strict` for the entire request body as bytes together with the content type for
+ arbitrary payload handling.
+ * `akka.http.javadsl.model.HttpRequest` for a low level, streaming representation of the entire request
+ including headers. See xref:http-endpoints.adoc#_low_level_requests[] below for more details
+
+You can now call these commands as well
+[source, command line]
+----
+curl -i -XPOST -H "Content-Type: application/json" localhost:9000/hello/hello -d '
+{"age":"30", "name":"Bob"}'
+----
+
+=== Response body ===
+
+To return response with JSON, the return value can be a class that Jackson can serialize:
+
+[source,java]
+.HelloWorldEndpoint.java
+----
+include::example$doc-snippets/src/main/java/com/example/api/ExampleEndpoint.java[tag=response-body]
+----
+<1> Returning an object that Jackson can serialize into JSON
+
+In addition to an object that can be turned to JSON, a request handler can return the following:
+
+ * `null` or `void` to return an empty body.
+ * `String` to return a UTF-8 encoded `text/plain` HTTP response.
+ * `CompletionStage` to respond based on an asynchronous result.
+ ** When the completion stage is completed with a `T` it is
+ turned into a response.
+ ** If it is instead failed, the failure leads to an error response according to
+ the error handling explained in xref:http-endpoints.adoc#_error_responses[error responses].
+ * `akka.http.javadsl.model.HttpResponse` for complete control over the response, see xref:http-endpoints.adoc#_low_level_responses[] below
+
+[source, command line]
+----
+curl localhost:9000/hello/hello/Bob/30
+----
+
+== Next steps
+Now that you have a basic service running, it's time to learn more about building real services in Akka. See the xref:java:shopping-cart-quickstart.adoc[] to build a more realistic application.
diff --git a/docs/src/modules/java/pages/component-and-service-calls.adoc b/docs/src/modules/java/pages/component-and-service-calls.adoc
index 7a176f1e4..3fc199bd7 100644
--- a/docs/src/modules/java/pages/component-and-service-calls.adoc
+++ b/docs/src/modules/java/pages/component-and-service-calls.adoc
@@ -10,6 +10,7 @@ Since Akka is an auto-scaling solution, components can be distributed across man
Requests and responses are always serialized to JSON between the client and the component.
+[#_component_client]
=== Component Client
The `akka.javasdk.client.ComponentClient` is a utility for making calls between components in a type-safe way. To use the `ComponentClient` you need to inject it into your component via the constructor:
@@ -65,4 +66,4 @@ include::java:example$doc-snippets/src/main/java/com/example/callanotherservice/
<3> Issue a GET call to the path `/astros.json` on the server
<4> Specify a class to parse the response body into
<5> Once the call completes, handle the response.
-<6> Return an adapted result object which will be turned into a JSON response.
\ No newline at end of file
+<6> Return an adapted result object which will be turned into a JSON response.
diff --git a/docs/src/modules/java/pages/consuming-producing.adoc b/docs/src/modules/java/pages/consuming-producing.adoc
index 6c4edaa59..e1aa74a96 100644
--- a/docs/src/modules/java/pages/consuming-producing.adoc
+++ b/docs/src/modules/java/pages/consuming-producing.adoc
@@ -194,7 +194,7 @@ See xref:reference:cli/index.adoc[`akka service deploy -h`] for details on how t
== Metadata
-For many use cases, a Consumer from Event Sourced or Key Value Entity will trigger other services and needs to pass the entity ID to the receiver. You can include this information in the event payload (or Key Value Entity state) or use build-in metadata to get this information. It is made available to the consumer via the metadata `messageContext().metadata().get("ce-subject")`. The same value can be also accessed via `CloudEvent` interface.
+For many use cases, a Consumer from Event Sourced or Key Value Entity will trigger other services and needs to pass the entity ID to the receiver. You can include this information in the event payload (or Key Value Entity state) or use built-in metadata to get this information. It is made available to the consumer via the metadata `messageContext().metadata().get("ce-subject")`. The same value can be also accessed via `CloudEvent` interface.
Using metadata is also possible when producing messages to a topic or a stream. You can pass some additional information which will be available to the consumer.
diff --git a/docs/src/modules/java/pages/http-endpoints.adoc b/docs/src/modules/java/pages/http-endpoints.adoc
index ebed436f2..bf5727b81 100644
--- a/docs/src/modules/java/pages/http-endpoints.adoc
+++ b/docs/src/modules/java/pages/http-endpoints.adoc
@@ -169,6 +169,7 @@ For more details see xref:component-and-service-calls.adoc[]
For more control over the request and responses it is also possible to use the more
low-level Akka HTTP model APIs.
+[#_low_level_responses]
=== Low level responses ===
Returning `akka.http.javadsl.model.HttpResponse` makes it possible to do more flexible and advanced responses.
diff --git a/docs/src/modules/java/pages/index.adoc b/docs/src/modules/java/pages/index.adoc
index bd7ae9098..4deac6050 100644
--- a/docs/src/modules/java/pages/index.adoc
+++ b/docs/src/modules/java/pages/index.adoc
@@ -23,7 +23,7 @@ include::ROOT:partial$local-dev-prerequisites.adoc[]
== Getting Started
-Follow xref:java:build-your-first-application.adoc[] to implement your first service. If you prefer to first explore working example code, you can check out the xref:samples.adoc[beginner samples].
+Follow xref:java:author-your-first-service.adoc[] to implement your first service. If you prefer to first explore working example code, you can check out the xref:shopping-cart-quickstart.adoc[] or our other xref:samples.adoc[samples].
On the other hand, if you would rather spend some time exploring our documentation, here are some main features you will find in this section:
diff --git a/docs/src/modules/java/pages/running-locally.adoc b/docs/src/modules/java/pages/running-locally.adoc
index d152d93b8..1bc6200ba 100644
--- a/docs/src/modules/java/pages/running-locally.adoc
+++ b/docs/src/modules/java/pages/running-locally.adoc
@@ -9,9 +9,10 @@ In order to run your service locally, you'll need to have the following prerequi
include::ROOT:partial$local-dev-prerequisites.adoc[]
+[[_starting_your_service]]
== Starting your service
-As an example, we will use the xref:build-your-first-application.adoc[Shopping Cart] sample.
+As an example, we will use the xref:shopping-cart-quickstart.adoc[Shopping Cart] sample.
To start your service locally, run the following command from the root of your project:
@@ -22,7 +23,7 @@ mvn compile exec:java
== Invoking your service
-After you start the service it will accept invocations on `localhost:9000`. You can use https://curl.se[cURL, window="new"] to invoke your service.
+After you start the service it will accept invocations on `localhost:9000`. You can use https://curl.se[cURL, window="new"] in another shell to invoke your service.
=== Using cURL
diff --git a/docs/src/modules/java/pages/samples.adoc b/docs/src/modules/java/pages/samples.adoc
index baf2b201b..f8d181185 100644
--- a/docs/src/modules/java/pages/samples.adoc
+++ b/docs/src/modules/java/pages/samples.adoc
@@ -5,20 +5,18 @@ include::ROOT:partial$include.adoc[]
====
*New to Akka? Start here:*
-xref:java:build-your-first-application.adoc[*Build a shopping cart*]
-
-This sample is recommended for beginners and provides a foundational understanding of Akka. Start here before exploring other samples.
+xref:java:author-your-first-service.adoc[] to get a minimal "Hello World!" Akka service and run it locally.
====
Samples are available that demonstrate important patterns and abstractions. These can be downloaded as zip files. Please refer to the `README` file in each zip for setup and usage instructions.
-[options="header", cols="4,2"]
+[options="header", cols="3,2,1"]
|=======================
-| Sample|Level
-| link:../java/_attachments/shopping-cart-quickstart.zip[Build a shopping cart]|Beginner
-| link:../java/_attachments/customer-registry-quickstart.zip[Build a customer registry with query capabilities]|Intermediate
-| link:../java/_attachments/workflow-quickstart.zip[Build a funds transfer workflow between two wallets]|Intermediate
-| link:../java/_attachments/choreography-saga-quickstart.zip[Build a user registration service implemented as a Choreography Saga]|Advanced
+| Description | Source download | Level
+| xref:shopping-cart-quickstart.adoc[Build a shopping cart] | link:../java/_attachments/shopping-cart-quickstart.zip[shopping-cart-quickstart.zip] |Beginner
+| A customer registry with query capabilities | link:../java/_attachments/customer-registry-quickstart.zip[customer-registry-quickstart.zip] |Intermediate
+| A funds transfer workflow between two wallets | link:../java/_attachments/workflow-quickstart.zip[workflow-quickstart.zip] |Intermediate
+| A user registration service implemented as a Choreography Saga | link:../java/_attachments/choreography-saga-quickstart.zip[choreography-saga-quickstart.zip] |Advanced
|=======================
[sidebar]
@@ -51,3 +49,5 @@ mvn archetype:generate ^
-DarchetypeVersion={akka-javasdk-version}
----
--
+
+The xref:java:author-your-first-service.adoc[] starts from the Maven archetype and lets you implement a very simple service.
diff --git a/docs/src/modules/java/pages/build-your-first-application.adoc b/docs/src/modules/java/pages/shopping-cart-quickstart.adoc
similarity index 68%
rename from docs/src/modules/java/pages/build-your-first-application.adoc
rename to docs/src/modules/java/pages/shopping-cart-quickstart.adoc
index e064fb606..cebea3466 100644
--- a/docs/src/modules/java/pages/build-your-first-application.adoc
+++ b/docs/src/modules/java/pages/shopping-cart-quickstart.adoc
@@ -1,87 +1,46 @@
-= Build your first application
+= Shopping cart quickstart
include::ROOT:partial$include.adoc[]
-This guide will walk you through the process of setting up your environment, generating a project, and implementing a simple application. By the end, you will have a functional Shopping Cart application built with the Akka SDK.
+This guide walks you through a shopping cart service illustrating the use of some of Akka's components.
== Overview
-The Akka SDK comes with Maven support that enables you to get started quickly. In this guide, you will:
+The shopping cart service implements a cart that allows users to add and remove items, get the contents of carts, and checkout the carts.
-* Use the Akka Maven archetype to generate a skeleton project that follows the recommended onion architecture.
-* Understand how to use the Akka Maven parent POM to define dependencies and run your application locally.
+In this guide you will
+
+* Download a completed shopping cart service to examine and run it locally.
+* Be introduced to key Akka concepts including xref:java:event-sourced-entities.adoc[Event Sourced Entities].
+* See how the Akka xref:concepts:architecture-model.adoc[] provides a clear separation of concerns in your microservices.
+* Run the service locally and explore it with the local Akka console.
+* Deploy the service to https://console.akka.io[akka.io].
== Prerequisites
include::ROOT:partial$cloud-dev-prerequisites.adoc[]
-== Generate and build the skeleton project
-
-The Maven archetype template prompts you to specify the project's group ID, name and version interactively. Run it using the commands shown for your OS.
-
-[sidebar]
-In IntelliJ, you can skip the command line. Open the IDE, select
-*File > New > Project*, and click to activate *Create from archetype*. Use the UI to locate the archetype and fill in the blanks.
+== Download the sample
-Follow these steps to generate and build your project:
+You can download the full source code of the Shopping Cart sample as a link:_attachments/shopping-cart-quickstart.zip[zip file], or you can use the Akka CLI command below to download and unzip this quickstart project.
-. From a command line, run the template in a convenient location:
-+
-[.tabset]
-Linux or macOS::
-+
---
-[source,command line, subs="attributes"]
-----
-mvn archetype:generate \
- -DarchetypeGroupId=io.akka \
- -DarchetypeArtifactId=akka-javasdk-archetype \
- -DarchetypeVersion={akka-javasdk-version}
-----
---
-Windows 10+::
-+
---
-[source,command line, subs="attributes"]
+[source,bash]
----
-mvn archetype:generate ^
- -DarchetypeGroupId=io.akka ^
- -DarchetypeArtifactId=akka-javasdk-archetype ^
- -DarchetypeVersion={akka-javasdk-version}
+akka quickstart download shopping-cart
----
---
-. Fill in
-* groupId: `com.example`
-* artifactId: `shoppingcart`
-* version: `1.0-SNAPSHOT`
-* package: `shoppingcart`
+Then open the project in your favorite IDE.
-. Navigate to the new project directory.
+== Understanding the shopping cart
-. Open it in your preferred IDE / Editor.
+For this quickstart walk-through, we will implement a Shopping Cart based on an _Event Sourced Entity_.
-== Implementing first component
+Through our "Shopping Cart" Event Sourced Entity we expect to manage our cart, adding and removing items as we please. Being event-sourced means it will represent changes to state as a series of domain events. Let’s have a look at what kind of model we use to store and the events our entity generates.
-Akka has different kinds of components that you can use to implement your application.
-The list of components are:
+=== The domain model
-* xref:java:event-sourced-entities.adoc[Event Sourced Entities]
-* xref:java:key-value-entities.adoc[Key Value Entities]
-* xref:java:http-endpoints.adoc[HTTP Endpoints]
-* xref:java:views.adoc[Views]
-* xref:java:workflows.adoc[Workflows]
-* xref:java:timed-actions.adoc[Timers]
-* xref:java:consuming-producing.adoc[Consumers]
-
-For this *Getting started* walk-through, we will implement a Shopping Cart based on an Event Sourced Entity.
-
-Through our "Shopping Cart" Event Sourced Entity we expect to manage our cart, adding and removing items as we please. Being event-sourced means it will represent changes to state as a series of domain events. Let’s have a look at what kind of model we expect to store and the events our entity might generate.
-
-=== Define the domain model
-
-First, define the domain class `ShoppingCart` in package `shoppingcart.domain`. This class should be located in the `src/main/java/shoppingcart/domain/` directory and saved as `ShoppingCart.java`.
+The first concept to note is the domain class `ShoppingCart` in package `shoppingcart.domain`. This class is located in the `src/main/java/shoppingcart/domain/` directory and named `ShoppingCart.java`.
[source,java,indent=0]
.{sample-base-url}/shopping-cart-quickstart/src/main/java/shoppingcart/domain/ShoppingCart.java[ShoppingCart.java]
@@ -91,7 +50,7 @@ include::example$shopping-cart-quickstart/src/main/java/shoppingcart/domain/Shop
<1> Our `ShoppingCart` is fairly simple, being composed only by a `cartId` and a list of line items.
<2> A `LineItem` represents a single product and the quantity we intend to buy.
-Next, let's define a domain event for adding items to the cart. Add an interface `ShoppingCartEvent` with the `ItemAdded` domain event in package `shoppingcart.domain`. This class should be located in the `src/main/java/shoppingcart/domain/` directory and saved as `ShoppingCartEvent.java`:
+Next, we have a domain event for adding items to the cart. Add an interface `ShoppingCartEvent` with the `ItemAdded` domain event in package `shoppingcart.domain`. This file should be located in the `src/main/java/shoppingcart/domain/` directory and named `ShoppingCartEvent.java`:
[source,java,indent=0]
.{sample-base-url}/shopping-cart-quickstart/src/main/java/shoppingcart/domain/ShoppingCartEvent.java[ShoppingCartEvent.java]
@@ -101,7 +60,9 @@ include::example$shopping-cart-quickstart/src/main/java/shoppingcart/domain/Shop
<1> `ItemAdded` event derives from the `ShoppingCartEvent` interface.
<2> Specifying a logical type name, required for serialization.
-Jumping back to the `ShoppingCart` domain class, add business logic to handle the `ItemAdded` domain event for adding items to the cart:
+You may notice that there are other events defined as well, this is how the application will pass Java events between the Akka runtime and the domain object.
+
+Jumping back to the `ShoppingCart` domain class, there is also business logic to handle the `ItemAdded` domain event for adding items to the cart:
[source,java,indent=0]
.{sample-base-url}/shopping-cart-quickstart/src/main/java/shoppingcart/domain/ShoppingCart.java[ShoppingCart.java]
@@ -113,17 +74,9 @@ include::example$shopping-cart-quickstart/src/main/java/shoppingcart/domain/Shop
<3> Adds the update item to the shopping cart.
<4> Returns a new instance of the shopping cart with the updated line items.
-If your integrated development environment (IDE) did not detect it, you may need to add the following imports manually:
+=== The ShoppingCart entity
-[source,java,indent=0]
-.{sample-base-url}/shopping-cart-quickstart/src/main/java/shoppingcart/domain/ShoppingCart.java[ShoppingCart.java]
-----
-include::example$shopping-cart-quickstart/src/main/java/shoppingcart/domain/ShoppingCart.java[tag=first-app-top-part-2]
-----
-
-=== Define the entity
-
-Create an Event Sourced Entity named `ShoppingCartEntity` in package `shoppingcart.application`. This class should be located in the `src/main/java/shoppingcart/application/` directory and saved as `ShoppingCartEntity.java`. The class signature should look like this:
+We also have an Event Sourced Entity named `ShoppingCartEntity` in package `shoppingcart.application`. This class is located in the `src/main/java/shoppingcart/application/` directory and named `ShoppingCartEntity.java`. The class signature looks like this:
[source,java]
.{sample-base-url}/shopping-cart-quickstart/src/main/java/shoppingcart/application/ShoppingCartEntity.java[ShoppingCartEntity.java]
@@ -133,11 +86,7 @@ include::example$shopping-cart-quickstart/src/main/java/shoppingcart/application
<1> Extend `EventSourcedEntity`, where `ShoppingCart` is the type of state this entity will store, and `ShoppingCartEvent` is the interface for the events it persists.
<2> Annotate the class so Akka can identify it as an Event Sourced Entity.
-At this point, you may encounter an error stating:
-`The type ShoppingCartEntity must implement the inherited abstract method EventSourcedEntity.applyEvent(ShoppingCartEvent).`
-This error is expected, and we will implement this abstract method in the next step.
-
-Inside `ShoppingCartEntity`, define an `addItem` command handler to generate an `ItemAdded` event, and an event handler to process the event:
+Inside `ShoppingCartEntity`, we define an `addItem` command handler to generate an `ItemAdded` event, and an event handler to process the event:
[source,java]
.{sample-base-url}/shopping-cart-quickstart/src/main/java/shoppingcart/application/ShoppingCartEntity.java[ShoppingCartEntity.java]
@@ -150,7 +99,7 @@ include::example$shopping-cart-quickstart/src/main/java/shoppingcart/application
<4> Acknowledge that the event was successfully persisted.
<5> Event handler to process the `ItemAdded` event and return the updated state.
-Inside `ShoppingCartEntity`, define a `getCart` command handler to retrieve the state of the shopping cart:
+Inside `ShoppingCartEntity`, we also define a `getCart` command handler to retrieve the state of the shopping cart:
[source,java,indent=0]
.{sample-base-url}/shopping-cart-quickstart/src/main/java/shoppingcart/application/ShoppingCartEntity.java[ShoppingCartEntity.java]
@@ -161,12 +110,11 @@ include::example$shopping-cart-quickstart/src/main/java/shoppingcart/application
<2> Define the initial state.
<3> Return the current state as a reply to the request.
-
-=== Define the external API
+=== The external API
The shopping cart API is defined by the `ShoppingCartEndpoint`.
-Create a class named `ShoppingCartEndpoint` in package `shoppingcart.api`. This class should be located in the `src/main/java/shoppingcart/api/` directory and saved as `ShoppingCartEndpoint.java`:
+It is a class named `ShoppingCartEndpoint` in package `shoppingcart.api`. This class is located in the `src/main/java/shoppingcart/api/` directory and named `ShoppingCartEndpoint.java`:
[source,java,indent=0]
.{sample-base-url}/shopping-cart-quickstart/src/main/java/shoppingcart/api/ShoppingCartEndpoint.java[ShoppingCartEndpoint.java]
@@ -181,11 +129,12 @@ include::example$shopping-cart-quickstart/src/main/java/shoppingcart/api/Shoppin
<6> Use path parameter `{cartId}` in combination with request body `ShoppingCart.LineItem`.
<7> Map request to a more suitable response, in this case an `HTTP 200 OK` response.
+
== Run locally
Start your service locally:
-[source,bash]
+[source, command line]
----
mvn compile exec:java
----
@@ -225,7 +174,7 @@ Request to see all of the items in the cart:
curl localhost:9000/carts/123
----
-Observe all of the items in the cart:
+Observe all the items in the cart:
[source]
----
@@ -332,9 +281,16 @@ A service status can be one of the following:
Approximately one minute after deploying, your service status should become *Ready*.
. Expose your service to the internet:
-[source,bash]
++
+[source, command line]
+----
+akka service expose cart-service
+----
++
+Should respond with something similar to (the exact address is generated for your service):
++
+[source]
----
-$ akka service expose cart-service
Service 'cart-service' was successfully exposed at: spring-tooth-3406.us-east1.akka.app
----
@@ -367,10 +323,6 @@ curl https://spring-tooth-3406.us-east1.akka.app/carts/123
image:console-first-app-service.png[]
-== Download full sample
-
-You can download the full source code of the Shopping Cart sample as a link:_attachments/shopping-cart-quickstart.zip[zip file].
-
== Next steps
Now that you've built and deployed a shopping cart service, take your Akka skills to the next level: