{"id":25149047,"url":"https://github.com/inomera/lock-provider","last_synced_at":"2025-04-28T14:48:25.619Z","repository":{"id":41572961,"uuid":"318428556","full_name":"inomera/lock-provider","owner":"inomera","description":"distributed and local lock provider ","archived":false,"fork":false,"pushed_at":"2025-04-10T07:41:36.000Z","size":161,"stargazers_count":7,"open_issues_count":1,"forks_count":5,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-10T08:39:39.439Z","etag":null,"topics":["distributed-systems","java","local","lock","optimistic-locking","pessimistic-locking"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/inomera.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-12-04T06:45:50.000Z","updated_at":"2025-04-10T07:41:40.000Z","dependencies_parsed_at":"2025-03-20T20:28:14.248Z","dependency_job_id":"f778bcfc-687b-4a28-846b-6986b44a871a","html_url":"https://github.com/inomera/lock-provider","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inomera%2Flock-provider","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inomera%2Flock-provider/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inomera%2Flock-provider/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inomera%2Flock-provider/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/inomera","download_url":"https://codeload.github.com/inomera/lock-provider/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251334016,"owners_count":21572936,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["distributed-systems","java","local","lock","optimistic-locking","pessimistic-locking"],"created_at":"2025-02-08T21:19:08.955Z","updated_at":"2025-04-28T14:48:25.606Z","avatar_url":"https://github.com/inomera.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Lock Provider\n\n![Build](https://github.com/inomera/lock-provider/workflows/Build/badge.svg)\n\n# Version Compatability\n\nCompatability Matrix\n\n| Version | JDK | Hazelcast | Redisson | Zookeeper |\n|---------|-----|---------|----------|-----------|\n| v4.x.x  | 23  | 5+      | 3.14.0   | 5.3.0     |\n| v3.x.x  | 17  | 4,5+    | 3.14.0   | 5.3.0     |\n| v2.x.x  | 8   | 3,4,5   | 3.14.0   | 5.1.0     |\n\n## Subprojects\n\n| Artifact                   | Version                                                                                                                                                                                                                                                  |\n|----------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| lock-provider-api          | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-api/badge.svg?version=4.0.0)](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-api)                   |\n| lock-provider-reentrant    | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-reentrant/badge.svg?version=4.0.0)](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-reentrant)       |\n| lock-provider-hazelcast-5x | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-hazelcast-5x/badge.svg?version=4.0.0)](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-hazelcast-5x) |\n| lock-provider-redis        | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-redis/badge.svg?version=4.0.0)](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-redis)               |\n| lock-provider-zookeeper    | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-zookeeper/badge.svg?version=4.0.0)](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-zookeeper)       |\n| -                          | -                                                                                                                                                                                                                                                        |\n| lock-provider-api          | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-api/badge.svg?version=3.0.0)](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-api)                   |\n| lock-provider-reentrant    | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-reentrant/badge.svg?version=3.0.0)](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-reentrant)       |\n| lock-provider-hazelcast-4x | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-hazelcast-4x/badge.svg?version=3.0.0)](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-hazelcast-4x) |\n| lock-provider-hazelcast-5x | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-hazelcast-5x/badge.svg?version=3.0.0)](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-hazelcast-5x) |\n| lock-provider-redis        | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-redis/badge.svg?version=3.0.0)](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-redis)               |\n| lock-provider-zookeeper    | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-zookeeper/badge.svg?version=3.0.0)](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-zookeeper)       |\n| -                          | -                                                                                                                                                                                                                                                        |\n| lock-provider-api          | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-api/badge.svg?version=2.0.0)](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-api)                   |\n| lock-provider-reentrant    | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-reentrant/badge.svg?version=2.0.0)](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-reentrant)       |\n| lock-provider-hazelcast-3x | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-hazelcast-3x/badge.svg?version=2.0.0)](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-hazelcast-3x) |\n| lock-provider-hazelcast-4x | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-hazelcast-4x/badge.svg?version=2.0.0)](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-hazelcast-4x) |\n| lock-provider-hazelcast-5x | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-hazelcast-5x/badge.svg?version=2.0.0)](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-hazelcast-5x) |\n| lock-provider-redis        | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-redis/badge.svg?version=2.0.0)](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-redis)               |\n| lock-provider-zookeeper    | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-zookeeper/badge.svg?version=2.0.0)](https://maven-badges.herokuapp.com/maven-central/com.inomera.telco.commons/lock-provider-zookeeper)       |\n\n\n# Usage\n\n## With Maven\n---\nJDK 23 Support\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.inomera.telco.commons\u003c/groupId\u003e\n  \u003cartifactId\u003elock-provider-reentrant\u003c/artifactId\u003e\n  \u003cversion\u003e4.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003cdependency\u003e\n\u003cgroupId\u003ecom.inomera.telco.commons\u003c/groupId\u003e\n\u003cartifactId\u003elock-provider-hazelcast-5x\u003c/artifactId\u003e\n\u003cversion\u003e4.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.inomera.telco.commons\u003c/groupId\u003e\n  \u003cartifactId\u003elock-provider-redis\u003c/artifactId\u003e\n  \u003cversion\u003e4.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.inomera.telco.commons\u003c/groupId\u003e\n  \u003cartifactId\u003elock-provider-zookeeper\u003c/artifactId\u003e\n  \u003cversion\u003e4.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n---\nJDK 17 Support\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.inomera.telco.commons\u003c/groupId\u003e\n  \u003cartifactId\u003elock-provider-reentrant\u003c/artifactId\u003e\n  \u003cversion\u003e3.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.inomera.telco.commons\u003c/groupId\u003e\n  \u003cartifactId\u003elock-provider-hazelcast-4x\u003c/artifactId\u003e\n  \u003cversion\u003e3.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003cdependency\u003e\n\u003cgroupId\u003ecom.inomera.telco.commons\u003c/groupId\u003e\n\u003cartifactId\u003elock-provider-hazelcast-5x\u003c/artifactId\u003e\n\u003cversion\u003e3.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.inomera.telco.commons\u003c/groupId\u003e\n  \u003cartifactId\u003elock-provider-redis\u003c/artifactId\u003e\n  \u003cversion\u003e3.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.inomera.telco.commons\u003c/groupId\u003e\n  \u003cartifactId\u003elock-provider-zookeeper\u003c/artifactId\u003e\n  \u003cversion\u003e3.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n---\n\nJDK 8 Support\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.inomera.telco.commons\u003c/groupId\u003e\n  \u003cartifactId\u003elock-provider-reentrant\u003c/artifactId\u003e\n  \u003cversion\u003e2.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.inomera.telco.commons\u003c/groupId\u003e\n  \u003cartifactId\u003elock-provider-hazelcast-3x\u003c/artifactId\u003e\n  \u003cversion\u003e2.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.inomera.telco.commons\u003c/groupId\u003e\n  \u003cartifactId\u003elock-provider-hazelcast-4x\u003c/artifactId\u003e\n  \u003cversion\u003e2.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003cdependency\u003e\n\u003cgroupId\u003ecom.inomera.telco.commons\u003c/groupId\u003e\n\u003cartifactId\u003elock-provider-hazelcast-5x\u003c/artifactId\u003e\n\u003cversion\u003e2.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.inomera.telco.commons\u003c/groupId\u003e\n  \u003cartifactId\u003elock-provider-redis\u003c/artifactId\u003e\n  \u003cversion\u003e2.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.inomera.telco.commons\u003c/groupId\u003e\n  \u003cartifactId\u003elock-provider-zookeeper\u003c/artifactId\u003e\n  \u003cversion\u003e2.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## With Gradle\n\nJDK 23 Support\n\n```groovy\nimplementation 'com.inomera.telco.commons:lock-provider-reentrant:4.0.0'\nimplementation 'com.inomera.telco.commons:lock-provider-hazelcast-5x:4.0.0'\nimplementation 'com.inomera.telco.commons:lock-provider-redis:4.0.0'\nimplementation 'com.inomera.telco.commons:lock-provider-zookeeper:4.0.0'\n```\n\nJDK 17 Support\n\n```groovy\nimplementation 'com.inomera.telco.commons:lock-provider-reentrant:3.0.0'\nimplementation 'com.inomera.telco.commons:lock-provider-hazelcast-4x:3.0.0'\nimplementation 'com.inomera.telco.commons:lock-provider-hazelcast-5x:3.0.0'\nimplementation 'com.inomera.telco.commons:lock-provider-redis:3.0.0'\nimplementation 'com.inomera.telco.commons:lock-provider-zookeeper:3.0.0'\n```\n\nJDK 8 Support\n\n```groovy\nimplementation 'com.inomera.telco.commons:lock-provider-reentrant:2.0.0'\nimplementation 'com.inomera.telco.commons:lock-provider-hazelcast-3x:2.0.0'\nimplementation 'com.inomera.telco.commons:lock-provider-hazelcast-4x:2.0.0'\nimplementation 'com.inomera.telco.commons:lock-provider-hazelcast-5x:2.0.0'\nimplementation 'com.inomera.telco.commons:lock-provider-redis:2.0.0'\nimplementation 'com.inomera.telco.commons:lock-provider-zookeeper:2.0.0'\n```\n\n## Create an Instance\n\n### With Hazelcast 3.x.x\n\n#### Dependency\n\n```groovy\nimplementation 'com.inomera.telco.commons:lock-provider-hazelcast-3x:2.0.0'\n```\n\n#### Instance\n\n```java\nimport com.inomera.telco.commons.lock.hazelcast.HazelcastLockProvider;\n\nfinal LockProvider lockProvider = new HazelcastLockProvider(hazelcastInstance);\n```\n\n\n### With Hazelcast 4.x.x\n\n#### Dependency\n\n```groovy\nimplementation 'com.inomera.telco.commons:lock-provider-hazelcast-4x:2.0.0'\n```\n\n\n### With Hazelcast 5.x.x\n\n#### Dependency\n\n```groovy\nimplementation 'com.inomera.telco.commons:lock-provider-hazelcast-5x:2.0.0'\n```\n\n#### Instance\n\n```java\nimport com.inomera.telco.commons.lock.hazelcast.HazelcastLockProvider;\n\nfinal LockProvider lockProvider = new HazelcastLockProvider(hazelcastInstance);\n```\n\n\n### With Redis\n\n#### Dependency\n\n```groovy\nimplementation 'com.inomera.telco.commons:lock-provider-redis:2.0.0'\n```\n\n#### Instance\n\n```java\nimport com.inomera.telco.commons.lock.redis.RedisLockProvider;\n\nfinal LockProvider lockProvider = new RedisLockProvider(redissonClient);\n```\n\n\n### With Zookeeper\n\n#### Dependency\n\n```groovy\nimplementation 'com.inomera.telco.commons:lock-provider-zookeeper:2.0.0'\n```\n\n#### Instance\n\n```java\nimport com.inomera.telco.commons.lock.zookeeper.ZookeeperLockProvider;\n\nfinal LockProvider lockProvider = new ZookeeperLockProvider(curatorClient);\n```\n\n\n### Non-distributed Lock Provider\n\n#### Dependency\n\n```groovy\nimplementation 'com.inomera.telco.commons:lock-provider-reentrant:2.0.0'\n```\n\n#### Instance\n\n```java\nimport com.inomera.telco.commons.lock.reentrant.LocalReentrantLockProvider;\n\nfinal LockProvider lockProvider = new LocalReentrantLockProvider();\n```\n\n## Optimistic Lock\n\n### Default Lock Map - Manual Unlock\n\nReturns empty optional if lock is not acquired.\n\n```java\nfinal Optional\u003cLocked\u003e maybeLocked = lockProvider.tryLock(\"lockKey\");\nmaybeLocked.ifPresent(locked -\u003e {\n        try {\n        // Do things in lock\n        } finally {\n        locked.unlock();\n  }\n          });\n```\n\n### Custom Lock Map - Manual Unlock\n\nReturns empty optional if lock is not acquired.\n\n```java\nfinal Optional\u003cLocked\u003e maybeLocked = lockProvider.tryLock(\"lockMapName\", \"lockKey\");\nmaybeLocked.ifPresent(locked -\u003e {\n        try {\n        // Do things in lock\n        } finally {\n        locked.unlock();\n  }\n          });\n```\n\n### Default Lock Map - Auto Unlock\n\n```java\nlockProvider.executeInTryLock(\"lockKey\", () -\u003e {\n        // Do stuff in lock\n        });\n```\n\n### Custom Lock Map - Auto Unlock\n\n```java\nlockProvider.executeInTryLock(\"lockMapName\", \"lockKey\", () -\u003e {\n        // Do stuff in lock\n        });\n```\n\n### Default Lock Map - Auto Unlock - Return Value\n\nReturns null if lock is not acquired.\n\n```java\nfinal String result = lockProvider.executeInTryLock(\"lockKey\", () -\u003e {\n    // Do stuff in lock\n    return \"result\";\n});\n```\n\n### Custom Lock Map - Auto Unlock - Return Value\n\nReturns null if lock is not acquired.\n\n```java\nfinal String result = lockProvider.executeInTryLock(\"lockMapName\", \"lockKey\", () -\u003e {\n    // Do stuff in lock\n    return \"result\";\n});\n```\n\n## Pesimistic Lock\n\n### Default Lock Map - Manual Unlock\n\n```java\nfinal Locked locked = lockProvider.lock(\"lockKey\");\ntry {\n        // Do stuff in lock\n        } finally {\n        locked.unlock();\n}\n```\n\n### Custom Lock Map - Manual Unlock\n\n```java\nfinal Locked locked = lockProvider.lock(\"lockMapName\", \"lockKey\");\ntry {\n        // Do stuff in lock\n        } finally {\n        locked.unlock();\n}\n```\n\n### Default Lock Map - Auto Unlock\n\n```java\nlockProvider.executeInLock(\"lockKey\", () -\u003e {\n        // Do stuff in lock\n        });\n```\n\n### Custom Lock Map - Auto Unlock\n\n```java\nlockProvider.executeInLock(\"lockMapName\", \"lockKey\", () -\u003e {\n        // Do stuff in lock\n        });\n```\n\n### Default Lock Map - Auto Unlock - Return Value\n\n```java\nfinal String result = lockProvider.executeInLock(\"lockKey\", () -\u003e {\n    // Do stuff in lock\n    return \"result\";\n});\n```\n\n### Custom Lock Map - Auto Unlock - Return Value\n\n```java\nfinal String result = lockProvider.executeInLock(\"lockMapName\", \"lockKey\", () -\u003e {\n    // Do stuff in lock\n    return \"result\";\n});\n```\n\n## Publishing\n\nTo publish a version to maven repository,\nyou should create a gradle.properties file in the root directory of this project.\n\nThe file is: `/path-to-project/gradle.properties`\n\nThis file is included in .gitignore file.\nYou should not commit it since it contains sensitive information.\n\nAdd credentials for maven repository to `gradle.properties` file.\n\nExample `gradle.properties` file:\n\n```\nmavenReleaseUrl=https://oss.sonatype.org/service/local/staging/deploy/maven2/\nmavenSnapshotUrl=https://oss.sonatype.org/content/repositories/snapshots/\nmavenUsername=************************\nmavenPassword=************************\nmavenPackageGroup=com.inomera\n\nsigning.keyId=******\nsigning.password=******\nsigning.secretKeyRingFile=******.gpg\n```\n\nThen you need to invoke `release.sh` script in the project root directory.\n\n```sh\n# When the latest VERSION is 1.1.1\n\n./release.sh --release-type patch --project $projectName\n# New version is 1.1.2\n\n./release.sh --release-type minor --project $projectName\n# New version is 1.2.0\n\n./release.sh --release-type major --project $projectName\n# New version is 2.0.0\n```\n\nTo publish a snapshot release, use `--snapshot` flag as follows:\n\n```sh\n./release.sh --release-type latest --project $projectName --snapshot\n```\n\nPlease change the version wisely.\n\n## Redisson client, why we choose?\n\nRedisson is more appropriate for our interface and also more mature according to the Jedis.\n\nredisson github : https://github.com/redisson\n\n## CuratorFramework client, why we choose?\n\nCuratorFramework is more appropriate for our interface and also more mature according to the Zookeper Java client.\n\ncurator github : https://github.com/apache/curator\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finomera%2Flock-provider","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finomera%2Flock-provider","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finomera%2Flock-provider/lists"}