package org.myeslib.util.hazelcast;
import java.util.concurrent.TimeUnit;
import lombok.extern.slf4j.Slf4j;
import org.myeslib.util.TimeUnitHelper;
import com.google.inject.Inject;
import com.google.inject.name.Named;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.IMap;
@Slf4j
public class HzJobLocker {
public static final String LOCK_FAILED_MSG = "Cannot lock. May be there is another job instance working concurrently";
private static final String TARGET_MAP = "distributedLockMap";
@Inject
public HzJobLocker(HazelcastInstance instance, @Named("job.id") String jobId, @Named("job.lock.duration") String jobDuration) {
this.instance = instance;
this.jobId = jobId;
this.jobDuration = jobDuration;
}
private final HazelcastInstance instance;
private final String jobId;
private final String jobDuration;
public boolean lock() {
boolean success ;
try {
TimeUnitHelper helper = new TimeUnitHelper(jobDuration);
Long durationInNumber = helper.getDurationAsNumber();
TimeUnit durationTime = helper.getDurationTime();
log.info(String.format("Will try to lock for jobId %s for %s %s...", jobId, durationInNumber.toString(), durationTime.toString()));
IMap<String, ?> map = instance.getMap(TARGET_MAP);
map.tryLock(jobId, durationInNumber, durationTime);
success = map.isLocked(jobId);
} catch (Throwable t) {
t.printStackTrace();
success = false;
}
return success;
}
}