{"id":33179641,"url":"https://github.com/elasticsoftwarefoundation/elasticactors","last_synced_at":"2026-04-07T06:31:29.280Z","repository":{"id":7132216,"uuid":"8428305","full_name":"elasticsoftwarefoundation/elasticactors","owner":"elasticsoftwarefoundation","description":"Persistent Stateful Actor System","archived":false,"fork":false,"pushed_at":"2026-04-05T07:31:06.000Z","size":7168,"stargazers_count":33,"open_issues_count":6,"forks_count":10,"subscribers_count":4,"default_branch":"master","last_synced_at":"2026-04-05T09:19:39.225Z","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":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/elasticsoftwarefoundation.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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":null,"dco":null,"cla":null}},"created_at":"2013-02-26T08:25:40.000Z","updated_at":"2026-04-05T07:31:08.000Z","dependencies_parsed_at":"2024-04-27T09:29:01.322Z","dependency_job_id":"897ee6fd-24df-425c-ac66-1997dc1ac78b","html_url":"https://github.com/elasticsoftwarefoundation/elasticactors","commit_stats":null,"previous_names":[],"tags_count":199,"template":false,"template_full_name":null,"purl":"pkg:github/elasticsoftwarefoundation/elasticactors","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elasticsoftwarefoundation%2Felasticactors","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elasticsoftwarefoundation%2Felasticactors/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elasticsoftwarefoundation%2Felasticactors/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elasticsoftwarefoundation%2Felasticactors/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/elasticsoftwarefoundation","download_url":"https://codeload.github.com/elasticsoftwarefoundation/elasticactors/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elasticsoftwarefoundation%2Felasticactors/sbom","scorecard":{"id":371330,"data":{"date":"2025-08-11","repo":{"name":"github.com/elasticsoftwarefoundation/elasticactors","commit":"e97d94edeec3c4d3d42e13ced261f13764eb67ef"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.8,"checks":[{"name":"Maintained","score":4,"reason":"5 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 4","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql.yml:35","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql.yml:36","Warn: no topLevel permission defined: .github/workflows/codeql.yml:1","Warn: no topLevel permission defined: .github/workflows/maven-publish-v6.yml:1","Warn: no topLevel permission defined: .github/workflows/maven-publish.yml:1","Warn: no topLevel permission defined: .github/workflows/maven-v6.yml:1","Warn: no topLevel permission defined: .github/workflows/maven.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"SAST","score":10,"reason":"SAST tool detected: CodeQL","details":["Info: SAST configuration detected: CodeQL","Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:50: update your workflow using https://app.stepsecurity.io/secureworkflow/elasticsoftwarefoundation/elasticactors/codeql.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/elasticsoftwarefoundation/elasticactors/codeql.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:65: update your workflow using https://app.stepsecurity.io/secureworkflow/elasticsoftwarefoundation/elasticactors/codeql.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:72: update your workflow using https://app.stepsecurity.io/secureworkflow/elasticsoftwarefoundation/elasticactors/codeql.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:103: update your workflow using https://app.stepsecurity.io/secureworkflow/elasticsoftwarefoundation/elasticactors/codeql.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/maven-publish-v6.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/elasticsoftwarefoundation/elasticactors/maven-publish-v6.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/maven-publish-v6.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/elasticsoftwarefoundation/elasticactors/maven-publish-v6.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/maven-publish-v6.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/elasticsoftwarefoundation/elasticactors/maven-publish-v6.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/maven-publish-v6.yml:78: update your workflow using https://app.stepsecurity.io/secureworkflow/elasticsoftwarefoundation/elasticactors/maven-publish-v6.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/maven-publish.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/elasticsoftwarefoundation/elasticactors/maven-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/maven-publish.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/elasticsoftwarefoundation/elasticactors/maven-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/maven-publish.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/elasticsoftwarefoundation/elasticactors/maven-publish.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/maven-publish.yml:79: update your workflow using https://app.stepsecurity.io/secureworkflow/elasticsoftwarefoundation/elasticactors/maven-publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/maven-v6.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/elasticsoftwarefoundation/elasticactors/maven-v6.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/maven-v6.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/elasticsoftwarefoundation/elasticactors/maven-v6.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/maven-v6.yml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/elasticsoftwarefoundation/elasticactors/maven-v6.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/maven.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/elasticsoftwarefoundation/elasticactors/maven.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/maven.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/elasticsoftwarefoundation/elasticactors/maven.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/maven.yml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/elasticsoftwarefoundation/elasticactors/maven.yml/master?enable=pin","Info:   0 out of  17 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/maven-publish-v6.yml:12"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T13:02:53.543Z","repository_id":7132216,"created_at":"2025-08-18T13:02:53.543Z","updated_at":"2025-08-18T13:02:53.543Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31503381,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T03:10:19.677Z","status":"ssl_error","status_checked_at":"2026-04-07T03:10:13.982Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2025-11-16T03:00:36.839Z","updated_at":"2026-04-07T06:31:29.270Z","avatar_url":"https://github.com/elasticsoftwarefoundation.png","language":"Java","readme":"Elastic Actors\n=============\n\nPersistent Stateful Actor System\n\nStarting from March 2023 we maintain 2 branches: `v6.x` and `v7.x`. The `v6.x` branch is compatible with Java 8, \nwhile the `v7.x` branch is compatible with Java 17 and higher.\n\n## Current v7.x version (v7.x Java 17 compatible)\n\n[![CI](https://github.com/elasticsoftwarefoundation/elasticactors/actions/workflows/maven.yml/badge.svg)](https://github.com/elasticsoftwarefoundation/elasticactors/actions/workflows/maven.yml)\n[![License: Apache 2](https://img.shields.io/badge/LICENSE-Apache2-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0.txt)\n[![Maven Central](https://img.shields.io/maven-central/v/org.elasticsoftwarefoundation.elasticactors/elasticactors-parent.svg?label=Maven%20Central\u0026versionPrefix=7)](https://search.maven.org/search?q=g:%22org.elasticsoftwarefoundation.elasticactors%22)\n\n\n## Current v6.x version (v6.x Java 8 compatible)\n\n[![CI](https://github.com/elasticsoftwarefoundation/elasticactors/actions/workflows/maven-v6.yml/badge.svg)](https://github.com/elasticsoftwarefoundation/elasticactors/actions/workflows/maven-v6.yml)\n[![License: Apache 2](https://img.shields.io/badge/LICENSE-Apache2-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0.txt)\n[![Maven Central](https://img.shields.io/maven-central/v/org.elasticsoftwarefoundation.elasticactors/elasticactors-parent.svg?label=Maven%20Central\u0026versionPrefix=6)](https://search.maven.org/search?q=g:%22org.elasticsoftwarefoundation.elasticactors%22)\n\n\n## Add Elastic Actors to your Project\n\nFor convenience and guaranteed compatiblity across versions, it's advisable to use our BOM in \nyour `dependencyManagement` section:\n```xml\n\u003cdependencyManagement\u003e\n    \u003cdependencies\u003e\n        \u003cdependency\u003e\n            \u003cgroupId\u003eorg.elasticsoftwarefoundation.elasticactors\u003c/groupId\u003e\n            \u003cartifactId\u003eelasticactors-bom\u003c/artifactId\u003e\n            \u003cversion\u003e${elasticactors.version}\u003c/version\u003e\n            \u003cscope\u003eimport\u003c/scope\u003e\n            \u003ctype\u003epom\u003c/type\u003e\n        \u003c/dependency\u003e\n    \u003c/dependencies\u003e\n\u003c/dependencyManagement\u003e\n```\n\nMinimal dependency:\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.elasticsoftwarefoundation.elasticactors\u003c/groupId\u003e\n    \u003cartifactId\u003eelasticactors-api\u003c/artifactId\u003e\n    \u003cversion\u003e${elasticactors.version}\u003c/version\u003e \u003c!-- Can be ommitted when using the BOM --\u003e\n\u003c/dependency\u003e\n```\nConvenient base classes, including a Jackson-based serialization framework:\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.elasticsoftwarefoundation.elasticactors\u003c/groupId\u003e\n    \u003cartifactId\u003eelasticactors-base\u003c/artifactId\u003e\n    \u003cversion\u003e${elasticactors.version}\u003c/version\u003e \u003c!-- Can be ommitted when using the BOM --\u003e\n\u003c/dependency\u003e\n```\n\n\n## Example code\n\nSome example code (in Java):\n\n```java\n@Message(serializationFramework = JacksonSerializationFramework.class,durable = true)\npublic class Greeting {\n    private final String who;\n\n    @JsonCreator\n    public Greeting(@JsonProperty(\"who\") String who) {\n        this.who = who;\n    }\n\n    public String getWho() {\n        return who;\n    }\n}\n\n@Actor(stateClass = StringState.class,serializationFramework = JacksonSerializationFramework.class)\npublic class GreetingActor extends TypedActor\u003cGreeting\u003e {\n    @Override\n    public void onReceive(ActorRef sender, Greeting message) throws Exception {\n        System.out.println(\"Hello \" + message.getWho());\n    }\n}\n\npublic class Main {\n    public static void main(String[] args) throws Exception {\n      TestActorSystem testActorSystem = new TestActorSystem();\n      testActorSystem.initialize();\n\n      ActorSystem actorSystem = testActorSystem.getActorSystem();\n      ActorRef greeter = actorSystem.actorOf(\"greeter\", GreetingActor.class);\n      greeter.tell(new Greeting(\"Joost van de Wijgerd\"), null);\n\n      testActorSystem.destroy();\n    }\n}\n```\n\n\n## Upgrading Elastic Actors\n\nUnless specified, Elastic Actors versions are backwards compatible at runtime and at the wire level.\n\nThe following exceptions apply:\n\n* **1.x - 4.x** to **5.x** or later:\n  * Changes to the shard-to-node distribution algorithm require the actor system to be completely \n    destroyed or scaled down to 1 node before deploying the new version.\n  * The tracing module was split between its basic implementation and an optional module to integrate\n    it with the logging framework. See [how to add trace information to logs in the section below](#adding-trace-information-to-logs).\n* **2.5 - 5.1** to **5.2** or later:\n  * The tracing module now integrates with Spring without the need to explicitly import the `TracingConfiguration` class.\n    See [how to instrument Spring beans in the section below](#instrumenting-spring-beans).\n  * Metrics and Logging settings are now only enabled for undeliverable messages and messages that use \n    the reactive streams protocol (such as Subscriptions) if explicitly configured.\n  * Configuration keys for indexing with Elasticsearch have been changed from `actor.indexing.*` \n    to `ea.indexing.*` in order for it to use the same format as other modules. \n* **1.x - 5.x** to **6.0** or later:\n  * Elastic Actors 6.0 introduces timeouts for Temporary Actors. If your application has long-lived \n    Temporary Actors, make sure to configure the timeout properties, so they suit your use-case.\n  * A major bug in the BUFFERED RabbitMQ ACKer was fixed. If you are using it, upgrade \n    to version 6.0 or later as soon as possible, or use another ACKer implementation.\n\n\n## Basic configuration\n\nElastic Actors scans actor and message classes under the packages defined in the file\n`classpath:META-INF/elasticactors.properties`. This file is required and contains only the following\nproperty:\n\n```properties\nbasePackage=your.actor.system.base.package\n```\n\nThe Actor System can be configured with a minimal YAML configuration file.\nKeys noted with an exclamation point mean they must not be changed after the Actor System has been\nput in production. They affect the communication between actors and changing them will cause\nthe system not to communicate properly anymore. \n\nThe Actor System name is used in the formation of the Actor's path.\\\nThe shard hash seed is used to determine in which shard a persitent actor will be placed.\\\nChanging either of them will cause the system not to find existing actors upon restart.\n\nExample: An actor that was in `actor://test.clusterName/test/shards/11/actorId` would now be \nfound in `actor://newName.clusterName/test/shards/23/actorId`. Changing the name would change\nthe beginning of the path, causing issues with persisted `ActorRef` objects. Changing the\nshard hashing seed may change the shard in which the actor resides. Therefore, it would not \nbe found in the persistence layer anymore, and it would not be able to receive messages.\n\n```yaml\n---\n# The name of this Actor System.\n# This MUST NOT be changed after the system has been deployed for the first time.\nname: test\n\n# The number of shards to use for persistent actors in this Actor System.\n# This MUST NOT be changed after the system has been deployed for the first time.\nshards: 8\n\n\n## Optional keys for performance tuning. \n# Refer to ActorSystemConfiguration for more details.\n\n# The number of queues per node.\n# This affects the parallelism level of temporary and service actors.\n# Default: 1.\nqueuesPerNode: 8\n\n# The number of queues per shard.\n# You can increase this in order to get more paralellism without resharding the system.\n# A change on this must be accompained by a change on the remote actor system configuration\n# of other actor systems that communicate with this one.\n# It's recommended to fully destroy and redeploy the system, and remote systems that send \n# messages to this one, if this changes.\n# Default: 1\nqueuesPerShard: 2\n\n# The hashing seed used for allocating actors to shards.\n# It's better to use a good prime number for better distribution.\n# This MUST NOT be changed after the system has been deployed for the first time.\n# Default: 0.\nshardHashSeed: 0\n\n# The hashing seed used for sending messages to the queues, when using more than one\n# queue per shard or per node.\n# It's better to use a good prime number for better load balancing.\n# A change on this must be accompained by a change on the remote actor system configuration\n# of other actor systems that communicate with this one.\n# It's recommended to fully destroy and redeploy the system, and remote systems that send \n# messages to this one, if this changes.\n# If using multiple queues per node, but only one queue per shard, restarting only\n# this actor system will suffice.\n# Default: 53.\nmultiQueueHashSeed: 53\n\n# The hashing seed used for distributing shards among nodes.\n# It's better to use a good prime number for better load balancing.\n# It's recommended to fully destroy and redeploy the system if this changes; or scale it down\n# to a single node before restarting it.\n# If two running nodes have different values, they might end up listening to the same shard\n# at the same time, which must be avoided.\n# Default: 53\nshardDistributionHashSeed: 53\n\n\n## Remote actor systems configuration.\n# In order for Actor Systems to communicate with one another, they must know\n# how to find each other and how to map actor IDs to shards and queues on \n# the other system.\nremoteActorSystems:\n  - clusterName: test2.elasticsoftware.org\n    name: default\n    shards: 8\n    #queuesPerShard: 2\n    #multiQueueHashSeed: 53\n  - clusterName: test3.elasticsoftware.org\n    name: default\n    shards: 8\n    #queuesPerShard: 3\n    #multiQueueHashSeed: 53\n    \n## Actor Configuration properties\n# Any other objects will be read as properties for a given actor type. \n\n# The general format is:\nactor.fully.qualified.class.name:\n  keys: values\n  \n# These are accessible through ActorSystemConfiguration. Example:\norg.elasticactors.http.actors.HttpService:\n  listenPort: 8080\norg.elasticactors.test.TestActor:\n  pushConfigurations:\n    - clientId: 123282\n      keystoreResource: classpath:test_1.p12\n      keystorePassword: bladiebla\n    - clientId: 193382\n      keystoreResource: classpath:test_1.p12\n      keystorePassword: bladiebla\norg.elasticsoftware.elasticactors.test.TestActorFullName:\n  pushConfigurations:\n    - clientId: 123282\n      keystoreResource: classpath:test_1.p12\n      keystorePassword: bladiebla\n    - clientId: 193382\n      keystoreResource: classpath:test_1.p12\n      keystorePassword: bladiebla\n```\n\n\n## Configuration properties\n\nThese properties can be set per-environment using any property source accepted by Spring.\nThis list is not exhaustive. Specific sections of this README may contain keys specific to them.\n\n```properties\n## Basic configuration\n\n# Elastic Actors cluster name\nea.cluster=cluster.name\n\n# This node's name (usually the hostname)\nea.node.id=node-name\n\n# This node's IP address or host name\nea.node.address=localhost\n\n# Elastic Actors config file location. \n# Default: \"classpath:ea-default.yaml\"\nea.node.config.location=file:/etc/config.yaml\n\n\n## Jackson serialization framework\n\n# Toggles the usage of the Jackson Afterburner module\nea.base.useAfterburner=false\n\n# Additional packages for scanning, if any, for registering subtypes using Jackson\nea.scan.packages=org.elasticsoftware.elasticactors\n\n\n## Caching and tuning\n\n# Maximum number of node-bound actors that can exist simultaneously in the node at any given time.\n# This affects the maximum number of temporary actors that can be used.\n# Default: 10240\nea.nodeCache.maximumSize=10240\n\n# The period in milliseconds between cache expiration checks for node-bound actors.\n# Expirable actors are checked for expiration when they receive messages, as well as by a\n# scheduled executor thread that runs every N milliseconds and removed expired actors.\n# This key allows you to adjust how often this thread will run. There is no maximum value, but it \n# enforces a minimum of 500ms so it can't be made to run so frequently.\n# Set it to 0 or lower to completely disable the periodic timeout checks.\n# Expired actors will still be invalidated when being fetched from the cache.\n# Default: 30000\n# Minimum: 500\nea.nodeCache.expirationCheckPeriod=30000\n\n# Maximum number of cached Persistent Actors.\n# Default: 10240\nea.shardCache.maximumSize=10240\n\n# Maximum number of actor references that can be cached.\n# Default: 10240\nea.actorRefCache.maximumSize=10240\n\n# Number of executor threads used for actor message handling.\n# Default: the host's number of processors multiplied by 3\nea.actorExecutor.workerCount=32\n\n# Toggle the usage of Disruptors for the actor thread bound executor instead of blocking queues.\n# Default: false\nea.actorExecutor.useDisruptor=false\n\n# Number of executor threads used for message queues.\n# Default: the host's number of processors multiplied by 3\nea.queueExecutor.workerCount=16\n\n# Toggle the usage of Disruptors for the queue thread bound executor instead of blocking queues.\n# Default: false\nea.queueExecutor.useDisruptor=false\n\n# Number of executor threads used for the asynchronous actor state update executor.\n# Default: the host's number of processors multiplied by 3\nea.asyncUpdateExecutor.workerCount=10\n\n\n## Shoal clustering library\n\n# Address and port numbers for node discovery.\nea.cluster.discovery.nodes=tcp://localhost:9090,tcp://localhost:9091,tcp://localhost:9092\n\n# Port for connection.\n# Default: 9090\nea.node.port=9090\n\n\n## K8s clustering library\n\n# Name of the StatefulSet\nea.cluster.kubernetes.statefulsetName=actor-system-set\n\n# Namespace in which the actor system's StatfulSet is deployed.\n# Default: default\nea.cluster.kubernetes.namespace=default\n\n# Toggles the usage of the number of desired replicas, rather than the number of \n# current replicas, when determining how many actor system nodes there currently are.\n# It's recommended to turn this off to minimize downtime, but this was historically \n# the default strategy, so it remains enabled unless turned off.\n# Default: true\nea.cluster.kubernetes.useDesiredReplicas=true\n\n\n## RabbitMQ messaging layer\n\n# RabbitMQ hosts\nea.rabbitmq.hosts=127.0.0.1\n\n# RabbitMQ user name.\n# Default: guest\nea.rabbitmq.username=guest\n\n# RabbitMQ password.\n# Default: guest\nea.rabbitmq.password=guest\n\n# RabbitMQ ACK type.\n# Options:\n#   - DIRECT: ACKs the messages on the handler thread\n#   - BUFFERED: ACKs the messages on one of the handler threads, buffering them in case of high load\n#       - **NOTE**: this implementation was broken in older versions of Elastic Actors. \n#                   It would wrongly ACK messages. \n#                   This was fixed in version 6.0.0.\n#   - WRITE_BEHIND: ACKs the messages asynchronously using a disruptor\n#   - ASYNC: ACKs the messages asynchronously using a separate thread\n# Default: DIRECT\nea.rabbitmq.ack=ASYNC\n\n# RabbitMQ thread model.\n# Options: \n#   - sc (single-channel): uses producer channel\n#   - cpt (channel-per-thread): uses one producer channel for each queue thread\n# Default: sc\nea.rabbitmq.threadmodel=cpt\n\n# RabbitMQ prefetch count.\n# Default: 0\nea.rabbitmq.prefetchCount=100\n\n\n## Persistent Actor Repository layer\n\n# Minimum size (in bytes) for which a serialized actor state will be compressed with LZ4\n# Default: 512 bytes\nea.persistentActorRepository.compressionThreshold=512\n\n\n## Cassandra backplane\n\n# Cassandra hosts.\n# Default: localhost\nea.cassandra.hosts=127.0.0.1\n\n# Cassandra cluster name.\n# Default: ElasticActorsCluster\nea.cassandra.cluster=ElasticActorsCluster\n\n# Cassandra keyspace.\n# Default: \"ElasticActors\"\nea.cassandra.keyspace=\"ElasticActors\"\n\n# Port for connection to Cassandra.\n# Default: 9042\nea.cassandra.port=9042\n\n# Delay for retrying downed hosts, in seconds.\n# Default: 1\nea.cassandra.retryDownedHostsDelayInSeconds=1\n\n# Maximum active connections per host.\n# Only backplane-cassandra and backplane-cassandra2.\n# Default: the host's number of processors multiplied by 3\nea.cassandra.maxActive=12\n\n# Batch size for batch updates\n# Default: 20\nea.asyncUpdateExecutor.batchSize=20\n\n# Whether or not to optimize v1 batches\n# Only backplane-cassandra2.\n# Default: true\nea.asyncUpdateExecutor.optimizedV1Batches=true\n\n# Let HFactory manage the cluster.\n# It seems that there are issues with the CassandraHostRetryService and retrying downed hosts.\n# If we don't let the HFactory manage the cluster, then CassandraHostRetryService doesn't try to\n# be smart about finding out if a host was removed from the ring, and so it will keep on retrying\n# all configured hosts (and ultimately fail-back when the host comes back online).\n# Only backplane-cassandra.\n# Default: true\nea.cassandra.hfactory.manageCluster=true\n\n\n## Indexing\n\n# Elasticsearch hosts for indexing Actors\n# Required, if using indexing\nea.indexing.elasticsearch.hosts=host1,host2\n\n# Elasticsearch port\n# Default: 9300\nea.indexing.elasticsearch.port=9300\n\n# Elasticsearch cluster name\n# Default: elasticsearch\nea.indexing.elasticsearch.cluster.name=elasticsearch\n\n\n## Metrics\n\n# Toggles metrics for messages in shard queues.\n# Default: false\nea.metrics.shard.messaging.enabled=false\n\n# Toggles metrics for undeliverable messages in shard queues. \n# Default: false\nea.metrics.shard.messaging.undeliverable.enabled=false\n\n# Toggles metrics for messages using the reactive streams protocol (such as Subscriptions) in shard queues. \n# Default: false\nea.metrics.shard.messaging.reactive.enabled=false\n\n# Configures the threshold for message delivery (total time spent in broker + local queues),\n# in microseconds.\n# Default: 0\nea.metrics.shard.messaging.delivery.warn.threshold=0\n\n# Configures the threshold for message handling in microseconds. \n# Default: 0\nea.metrics.shard.messaging.handling.warn.threshold=0\n\n# Configures the threshold for actor state serialization. \n# Default: 0\nea.metrics.shard.serialization.warn.threshold=0\n\n# Toggles metrics for messages in node queues.\n# Default: false\nea.metrics.node.messaging.enabled=false\n\n# Toggles metrics for undeliverable messages in node queues. \n# Default: false\nea.metrics.node.messaging.undeliverable.enabled=false\n\n# Toggles metrics for messages using the reactive streams protocol (such as Subscriptions) in node queues. \n# Default: false\nea.metrics.node.messaging.reactive.enabled=false\n\n# Configures the threshold for message delivery (total time spent in broker + local queues),\n# in microseconds.\n# Default: 0\nea.metrics.node.messaging.delivery.warn.threshold=0\n\n# Configures the threshold for message handling in microseconds.\n# Default: 0\nea.metrics.node.messaging.handling.warn.threshold=0\n\n\n## Logging\n\n# Toggles logging for messages in shard queues. \n# Default: false\nea.logging.shard.messaging.enabled=false\n\n# Toggles logging for undeliverable messages in shard queues. \n# Default: false\nea.logging.shard.messaging.undeliverable.enabled=false\n\n# Toggles logging for messages using the reactive streams protocol (such as Subscriptions) in shard queues. \n# Default: false\nea.logging.shard.messaging.reactive.enabled=false\n\n# Toggles logging for messages in node queues. \n# Default: false\nea.logging.node.messaging.enabled=false\n\n# Toggles logging for undeliverable messages in node queues. \n# Default: false\nea.logging.node.messaging.undeliverable.enabled=false\n\n# Toggles logging for messages using the reactive streams protocol (such as Subscriptions) in node queues. \n# Default: false\nea.logging.node.messaging.reactive.enabled=false\n\n# Default set of features for logging message types.\n# Features defined here have the lowest precedence, meaning any features defined in the \n# @Message annotation or overrides take precedence over this.\n# This does not affect internal messages defined in the Elastic Actors framework.\n# The value is a list of comma-separated features.\n# Refer to the @Message.LogFeature enum for options and their meanings.\n# Default: empty\nea.logging.messages.default=BASIC,TIMING,CONTENTS\n\n# Optional LogFeature overrides for specific message types.\n# Features defined here have the highest precedence, meaning any features defined here will \n# override both the default and those defined in the @Message annotation for any message type.\n# These overrides affect internal messages defined in the Elastic Actors framework too, in case\n# that's needed for debugging.\n# The value is a list of comma-separated features.\n# Refer to the @Message.LogFeature enum for options and their meanings.\n# To disable all features, add the key but leave its value empty.\nea.logging.messages.overrides.[class_name]=BASIC,TIMING,CONTENTS\n\n# The maximum number of characters when logging message contents. \n# Default: 5000\nea.logging.messages.maxLength=5000\n\n# If set to true, transient messages will use the toString() method \n# instead of being serialized for logging purposes. \n# Default: false\nea.logging.messages.transient.useToString=false\n```\n\n\n## System properties\n\nThe following properties must be provided as system properties, if changing them is desired.\n\n```properties\n# Toggles serialization caching. \n# Default: false\nea.serializationCache.enabled=false\n\n# Toggles deserialization caching. \n# Default: false\nea.deserializationCache.enabled=false\n\n# Changes the logging level used when logging unhandled message types in MethodActor.\n# Default: WARN\nea.logging.messages.unhandled.level=WARN\n\n# Changes the minimum timeout, in milliseconds, for Temporary Actors.\n# It will be clamped to the closest positive integer, if the provided number is negative or 0.\n# Default: 1000 (1 second)\nea.tempActor.timeout.min=1000\n\n# Changes the default timeout, in milliseconds, for Temporary Actors.\n# It will be clamped so it sits between the minimum and maximum configured numbers.\n# Default: 86400000 (one 24h day)\nea.tempActor.timeout.default=86400000\n\n# Changes the maximum timeout, in milliseconds, for Temporary Actors.\n# It will be champed to be larger than or equal to the minimum configured number.\n# Default: 172800000 (two 24h days)\nea.tempActor.timeout.max=172800000\n```\n\n\n## Class loading cache\n\nElastic Actors dynamically loads classes during message handling.\nThat hasn't been a performance issue so far, but if you're making use \nof the logging facilities above, the number of times a class is dynamically \nloaded can increase. Since these operations can introduce some level of \ncontention due to synchronization, a class loading cache is available\nif that happens to impact the performance of your application. Just add \nthe following dependency to your build:\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.elasticsoftwarefoundation.elasticactors\u003c/groupId\u003e\n    \u003cartifactId\u003eelasticactors-caching\u003c/artifactId\u003e\n    \u003cscope\u003eruntime\u003c/scope\u003e\n\u003c/dependency\u003e\n```\n\n\n## Tracing\n\nElastic Actors has a distributed tracing implementation based on the [OpenTracing](https://opentracing.io) specification.\\\nIt supports trace ID propagation and custom baggage, including propagation. \n\nThere is currently no support for exporting traces or span sampling.\nThe code is highly optimized, however, and there is little overhead in using it.\n\nMessages also carry data about where they were created.\n\nIf in an Actor Context, the actor's type and ID will be used. If not, it's possible to define\na custom creation context. \\\nFor example, when receiving a request from a web controller, you\ncan set the current creation context which will get injected into any messages sent during the \nhandling of that request.\n\nIn order to use distributed tracing, include the following dependency in your project:\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.elasticsoftwarefoundation.elasticactors\u003c/groupId\u003e\n    \u003cartifactId\u003eelasticactors-tracing\u003c/artifactId\u003e\n    \u003cscope\u003eruntime\u003c/scope\u003e\n\u003c/dependency\u003e\n```\n\n`MessagingContextManager` is the main class responsible for managing trace context data.\\\nIt allows you to put a set of trace and creation contexts into scope.\n\n\n### Instrumenting Spring beans\n\nIn order to instrument asynchronous executor beans automatically, add the following dependency \nto your project:\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.elasticsoftwarefoundation.elasticactors\u003c/groupId\u003e\n    \u003cartifactId\u003eelasticactors-tracing-spring\u003c/artifactId\u003e\n    \u003cscope\u003eruntime\u003c/scope\u003e\n\u003c/dependency\u003e\n```\n\nThis includes a bean post-processor that wraps those facilities in ones\nthat can automatically propagate the traces from Elastic Actors.\n\n\n### Adding trace information to logs\n\nThe `MessagingContextManager` also has the facilities to add the trace and creation contexts, \nas well as some message handling information, to the logging library's MDC \n(Mapped Diagnostic Context) through Slf4j. This is optional and can be enabled by adding the \nfollowing dependency in your project:\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.elasticsoftwarefoundation.elasticactors\u003c/groupId\u003e\n    \u003cartifactId\u003eelasticactors-tracing-slf4j\u003c/artifactId\u003e\n    \u003cscope\u003eruntime\u003c/scope\u003e\n\u003c/dependency\u003e\n```\n\n### Metrics\n\nStarting from version 5.2, Elastic Actors supports exporting its internal metrics using [Micrometer](https://micrometer.io/).\n\nAll metrics are optional and can be enabled/disabled independently using configuration properties.\nIf metrics are enabled, Elastic Actors will expect the existence of a bean of type `MeterRegistry` \nand name `elasticActorsMeterRegistry`. The supplied bean will be used to add the metrics.\n\n```properties\n# Optional prefix for component names\nea.metrics.micrometer.namePrefix=prefix\n\n# Option global metrics prefix\nea.metrics.micrometer.prefix=elastic.actors\n\n# Toggles Micrometer ON or OFF for a given component.\n#\n# The following components are currently supported:\n# - Caches:\n#   - actorRefCache: ActorRef cache\n#   - nodeActorCache: Node actor state cache\n#   - shardActorCache: Shard actor state cache\n# - Thread-bound executors:\n#   - queueExecutor: Message queue executor\n#   - actorExecutor: Actor message handler executor\n#   - asyncUpdateExecutor: Actor state persistence executor\n#   - actorStateUpdateProcessor: Actor state update processor executor\n# - Messaging services:\n#   - rabbitmq: RabbitMQ metrics\n#   - rabbitmqAcker: ASYNC ACKer executor service\n# - Message schedulers:\n#   - scheduler: Scheduler executor service\n#\n# Default (for all components): false\nea.metrics.micrometer.[component_name].enabled=false\n\n# Optional metric prefix for a given component.\n# Component-specific prefixes are inserted after the global prefix.\nea.metrics.micrometer.[component_name].prefix=ea\n\n# Optional custom tags for a given component.\n# Keep in mind that all meters created by Elastic Actors will contain at least the following tags:\n#   - elastic.actors.generated: true\n#   - elastic.actors.node.id: [the node's ID]\n#   - elastic.actors.cluster.name: [the cluster's name]\n# Can be repeated multiple times for a given component in order to add multiple tags.\nea.metrics.micrometer.[component_name].tags.[tag_name]=tag_value\n\n# Toggles exporting the message delivery times for a given component.\n# These are a rough estimate of the time it took from the message being created until it \n# arrived at the receiving actor, in milliseconds.\n# Currently, this only applies to the \"actorExecutor\" component.\n# Default: false\nea.metrics.micrometer.[component_name].measureDeliveryTimes=false\n\n# Toggles adding the message wrapper types as tags for a given component.\n# Adds the current message's wrapper as the tag \"elastic.actors.message.wrapper\" and creates a new timer with the wrapper's name as a suffix.\n# Currently, this only applies to the \"actorExecutor\" component.\n# Default: false\nea.metrics.micrometer.[component_name].tagMessageWrapperTypes=false\n\n# Toggles adding the task types as tags for a given component.\n# Adds the current thread-bound task type as the tag \"elastic.actors.message.task\" and creates a new timer with the task's name as a suffix.\n# Currently, this only applies to the \"actorExecutor\" component.\n# Default: false\nea.metrics.micrometer.[component_name].tagTaskTypes=false\n\n# Allows detailed tagging for the specified actor type for a given component.\n# Adds the receiver type as the tag \"elastic.actors.actor.type\" and creates a new timer with the provided suffix.\n# Currently, this only applies to the \"actorExecutor\" component.\n# This might cause some additional overhead, so use this option with caution.\nea.metrics.micrometer.[component_name].detailed.actors.[class_name]=metric.suffix\n\n# Allows detailed tagging for the specified message types for a given component.\n# This requires the type of the receiver actor to be present in the list of actors allowed for \n# detailed tagging.\n# Adds the receiver type as the tag \"elastic.actors.message.type\" and creates a new timer with the provided suffix.\n# Currently, this only applies to the \"actorExecutor\" component.\n# This might cause some additional overhead, so use this option with caution.\nea.metrics.micrometer.[component_name].detailed.messages.[class_name]=metric.suffix\n```\n\nAdditionally, customization of tags is supported by providing a bean of type `MeterTagCustomizer`\nand name `elasticActorsMeterTagCustomizer`.\n\n\n### Performance impact of tracing with log context on applications using Log4j2\n\nIf running a web application while using Log4j2 for logging, using tracing can generate\na big amount of garbage objects due to Log4j2 using a different implementation of the map\nthat backs the MDC. In order to avoid performance issues, run your application with the following\nsystem properties set to:\n\n```properties\nlog4j2.is.webapp=false\nlog4j2.garbagefree.threadContextMap=true\n```\n\n### Release process\n\nmake sure you select the right branch: `master` `7.x (Java 17)` and `elasticactors-v6` for `v6.x (Java 8)` releases\n\nalso make sure to use the correct JDK version for the release. The `elasticactors-v6` branch requires JDK 11. \nOn `master` JDK 17 is required.\n\nThis project uses the Maven Release Plugin and GitHub Actions to create releases.\\\nJust run `mvn release:prepare release:perform \u0026\u0026 git push` to select the version to be released and create a \nVCS tag. \n\nGitHub Actions will start [the build process](https://github.com/elasticsoftwarefoundation/elasticactors/actions/workflows/maven-publish.yml). \n\nIf successful, the build will be automatically published to [Maven Central](https://repo.maven.apache.org/maven2/org/elasticsoftwarefoundation/elasticactors/).\n","funding_links":[],"categories":["并发编程","\u003ca name=\"Java\"\u003e\u003c/a\u003eJava"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felasticsoftwarefoundation%2Felasticactors","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felasticsoftwarefoundation%2Felasticactors","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felasticsoftwarefoundation%2Felasticactors/lists"}