Skip to content

inomera/lock-provider

Repository files navigation

Lock Provider

Build

Subprojects

Artifact Version
lock-provider-api Maven Central
lock-provider-reentrant Maven Central
lock-provider-hazelcast-3x Maven Central
lock-provider-hazelcast-4x Maven Central
lock-provider-hazelcast-5x Maven Central
lock-provider-redis Maven Central
lock-provider-zookeeper Maven Central

Usage

With Maven

<dependency>
  <groupId>com.inomera.telco.commons</groupId>
  <artifactId>lock-provider-reentrant</artifactId>
  <version>2.0.0</version>
</dependency>

<dependency>
  <groupId>com.inomera.telco.commons</groupId>
  <artifactId>lock-provider-hazelcast-3x</artifactId>
  <version>2.0.0</version>
</dependency>

<dependency>
  <groupId>com.inomera.telco.commons</groupId>
  <artifactId>lock-provider-hazelcast-4x</artifactId>
  <version>2.0.0</version>
</dependency>

<dependency>
<groupId>com.inomera.telco.commons</groupId>
<artifactId>lock-provider-hazelcast-5x</artifactId>
<version>2.0.0</version>
</dependency>

<dependency>
  <groupId>com.inomera.telco.commons</groupId>
  <artifactId>lock-provider-redis</artifactId>
  <version>2.0.0</version>
</dependency>

<dependency>
  <groupId>com.inomera.telco.commons</groupId>
  <artifactId>lock-provider-zookeeper</artifactId>
  <version>2.0.0</version>
</dependency>

With Gradle

implementation 'com.inomera.telco.commons:lock-provider-reentrant:2.0.0'
implementation 'com.inomera.telco.commons:lock-provider-hazelcast-3x:2.0.0'
implementation 'com.inomera.telco.commons:lock-provider-hazelcast-4x:2.0.0'
implementation 'com.inomera.telco.commons:lock-provider-hazelcast-5x:2.0.0'
implementation 'com.inomera.telco.commons:lock-provider-redis:2.0.0'
implementation 'com.inomera.telco.commons:lock-provider-zookeeper:2.0.0'

Create an Instance

With Hazelcast 3.x.x

Dependency

implementation 'com.inomera.telco.commons:lock-provider-hazelcast-3x:2.0.0'

Instance

import com.inomera.telco.commons.lock.hazelcast.HazelcastLockProvider;

final LockProvider lockProvider = new HazelcastLockProvider(hazelcastInstance);

With Hazelcast 4.x.x

Dependency

implementation 'com.inomera.telco.commons:lock-provider-hazelcast-4x:2.0.0'

With Hazelcast 5.x.x

Dependency

implementation 'com.inomera.telco.commons:lock-provider-hazelcast-5x:2.0.0'

Instance

import com.inomera.telco.commons.lock.hazelcast.HazelcastLockProvider;

final LockProvider lockProvider = new HazelcastLockProvider(hazelcastInstance);

With Redis

Dependency

implementation 'com.inomera.telco.commons:lock-provider-redis:2.0.0'

Instance

import com.inomera.telco.commons.lock.redis.RedisLockProvider;

final LockProvider lockProvider = new RedisLockProvider(redissonClient);

With Zookeeper

Dependency

implementation 'com.inomera.telco.commons:lock-provider-zookeeper:2.0.0'

Instance

import com.inomera.telco.commons.lock.zookeeper.ZookeeperLockProvider;

final LockProvider lockProvider = new ZookeeperLockProvider(curatorClient);

Non-distributed Lock Provider

Dependency

implementation 'com.inomera.telco.commons:lock-provider-reentrant:2.0.0'

Instance

import com.inomera.telco.commons.lock.reentrant.LocalReentrantLockProvider;

final LockProvider lockProvider = new LocalReentrantLockProvider();

Optimistic Lock

Default Lock Map - Manual Unlock

Returns empty optional if lock is not acquired.

final Optional<Locked> maybeLocked = lockProvider.tryLock("lockKey");
maybeLocked.ifPresent(locked -> {
  try {
    // Do things in lock
  } finally {
    locked.unlock();
  }
});

Custom Lock Map - Manual Unlock

Returns empty optional if lock is not acquired.

final Optional<Locked> maybeLocked = lockProvider.tryLock("lockMapName", "lockKey");
maybeLocked.ifPresent(locked -> {
  try {
    // Do things in lock
  } finally {
    locked.unlock();
  }
});

Default Lock Map - Auto Unlock

lockProvider.executeInTryLock("lockKey", () -> {
  // Do stuff in lock
});

Custom Lock Map - Auto Unlock

lockProvider.executeInTryLock("lockMapName", "lockKey", () -> {
  // Do stuff in lock
});

Default Lock Map - Auto Unlock - Return Value

Returns null if lock is not acquired.

final String result = lockProvider.executeInTryLock("lockKey", () -> {
  // Do stuff in lock
  return "result";
});

Custom Lock Map - Auto Unlock - Return Value

Returns null if lock is not acquired.

final String result = lockProvider.executeInTryLock("lockMapName", "lockKey", () -> {
  // Do stuff in lock
  return "result";
});

Pesimistic Lock

Default Lock Map - Manual Unlock

final Locked locked = lockProvider.lock("lockKey");
try {
  // Do stuff in lock
} finally {
  locked.unlock();
}

Custom Lock Map - Manual Unlock

final Locked locked = lockProvider.lock("lockMapName", "lockKey");
try {
  // Do stuff in lock
} finally {
  locked.unlock();
}

Default Lock Map - Auto Unlock

lockProvider.executeInLock("lockKey", () -> {
  // Do stuff in lock
});

Custom Lock Map - Auto Unlock

lockProvider.executeInLock("lockMapName", "lockKey", () -> {
  // Do stuff in lock
});

Default Lock Map - Auto Unlock - Return Value

final String result = lockProvider.executeInLock("lockKey", () -> {
  // Do stuff in lock
  return "result";
});

Custom Lock Map - Auto Unlock - Return Value

final String result = lockProvider.executeInLock("lockMapName", "lockKey", () -> {
  // Do stuff in lock
  return "result";
});

Publishing

To publish a version to maven repository, you should create a gradle.properties file in the root directory of this project.

The file is: /path-to-project/gradle.properties

This file is included in .gitignore file. You should not commit it since it contains sensitive information.

Add credentials for maven repository to gradle.properties file.

Example gradle.properties file:

mavenReleaseUrl=https://oss.sonatype.org/service/local/staging/deploy/maven2/
mavenSnapshotUrl=https://oss.sonatype.org/content/repositories/snapshots/
mavenUsername=************************
mavenPassword=************************
mavenPackageGroup=com.inomera

signing.keyId=******
signing.password=******
signing.secretKeyRingFile=******.gpg

Then you need to invoke release.sh script in the project root directory.

# When the latest VERSION is 1.1.1

./release.sh --release-type patch --project $projectName
# New version is 1.1.2

./release.sh --release-type minor --project $projectName
# New version is 1.2.0

./release.sh --release-type major --project $projectName
# New version is 2.0.0

To publish a snapshot release, use --snapshot flag as follows:

./release.sh --release-type latest --project $projectName --snapshot

Please change the version wisely.

Redisson client, why we choose?

Redisson is more appropriate for our interface and also more mature according to the Jedis.

redisson github : https://github.com/redisson

CuratorFramework client, why we choose?

CuratorFramework is more appropriate for our interface and also more mature according to the Zookeper Java client.

curator github : https://github.com/apache/curator