我正在尝试测试我的分布式锁实现,但我还没有找到一种方法让它工作。 我使用两种简单的方法部署了一个REST服务,如下所示:
@GET
@Path("/lock")
@Produces("text/*")
public String lock() throws InterruptedException {
Lock lock = distributedService.getDistributedLock("test");
boolean result = lock.tryLock(5, TimeUnit.SECONDS);
return result ? "locked" : "timeout";
}
@GET
@Path("/unlock")
@Produces("text/*")
public String unlock() {
Lock lock = distributedService.getDistributedLock("test");
lock.unlock();
return "unlocked";
}
distributedService 对象实现了getDistributedLock()方法:
@Override
public Lock getDistributedLock(String lockName) {
return Hazelcast.getDefaultInstance().getLock(lockName);
}
在hazelcast.xml文件中,我启用了TCP-IP连接并禁用了其他所有内容:
<network>
<port auto-increment="true">5701</port>
<join>
<multicast enabled="false" />
<tcp-ip enabled="true">
<interface>192.168.0.01</interface>
<interface>192.168.0.02</interface>
</tcp-ip>
</join>
<interfaces enabled="false" />
<symmetric-encryption enabled="false" />
<asymmetric-encryption enabled="false" />
我在两台机器中部署了应用程序,IP地址对应于.xml文件(192.168.0.01和192.168.0.02),当我从浏览器调用服务时它第一次工作(它锁定并返回“锁定”)并且每次我调用unlock()方法它都会正确返回(我得到字符串“unlocked”)但是在第一次之后,每次调用lock()方法时都会出现超时。它看起来不像unlock()方法解锁它。
有人能指出使用分布式锁定与淡褐色的正确方法吗?
答案 0 :(得分:7)
只有锁定的线程才能将其解锁。您说您已实施REST以进行锁定和解锁。我想锁定和解锁的线程是不同的。这就是它无法正常工作的原因。尝试打印线程名称并查看自己。