当前位置: 首页 > 知识库问答 >
问题:

Hazelcast不工作的分布式锁

孟乐
2023-03-14

我正在尝试测试我的分布式锁实现,但是我仍然没有找到使它工作的方法。我用两个简单的方法部署了一个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);
}

在黑兹尔卡斯特。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()方法并没有解锁它。

有人能给我指出正确的方法来使用Hazelcast分布式锁吗?

共有1个答案

陆耀
2023-03-14

只有锁定的线程才能解锁它。您的意思是,您已经实现了用于锁定和解锁的REST。我猜锁定和解锁的线程是不同的。这就是它不起作用的原因。尝试打印线程名称并查看您自己。

 类似资料:
  • 假设Alice现在开始了一个新项目,在/home/alice/project建了一个新的git 仓库(repository);另外Bob的工作目录也在同一台机器,他要提交代码。 Bob 执行了这样的命令: $ git clone /home/alice/project myrepo 这就建了一个新的叫"myrepo"的目录,这个目录里包含了一份Alice的仓库的 克隆(clone). 这份克隆和

  • 你现在拥有了一个远程 Git 版本库,能为所有开发者共享代码提供服务,在一个本地工作流程下,你也已经熟悉了基本 Git 命令。你现在可以学习如何利用 Git 提供的一些分布式工作流程了。 这一章中,你将会学习如何作为贡献者或整合者,在一个分布式协作的环境中使用 Git。 你会学习为一个项目成功地贡献代码,并接触一些最佳实践方式,让你和项目的维护者能轻松地完成这个过程。另外,你也会学到如何管理有很多

  • 同传统的集中式版本控制系统(CVCS)不同,Git 的分布式特性使得开发者间的协作变得更加灵活多样。 在集中式系统中,每个开发者就像是连接在集线器上的节点,彼此的工作方式大体相像。 而在 Git 中,每个开发者同时扮演着节点和集线器的角色——也就是说,每个开发者既可以将自己的代码贡献到其他的仓库中,同时也能维护自己的公开仓库,让其他人可以在其基础上工作并贡献代码。 由此,Git 的分布式协作可以为

  • 我正在集群中使用hazelcast-2.5。我有一个映射(键:字符串,值:用户定义对象的ArrayList)。我可以在大多数地方put/remove fine,但在代码的一个特定部分,put操作会无声无息地失败(用于put操作的键字符串是唯一的,ArrayList也不是空的)。不会引发异常。如果涉及锁,我甚至尝试了tryPut,该调用给出了一个真实的返回值。在put操作之后,我尝试打印出映射的ke

  • 我将hazelcast服务器分布在多个节点上。我假设hazelcast将在集群中分发任何IMap数据,这样每个节点都将拥有属于映射的数据。这是建立集群后默认情况下应该发生的事情,还是需要在hazelcast.xml中设置代码或配置?

  • 我们使用分布式查询来搜索带有键的部分值的条目。 我们的基础设施目前只能提供微服务的一个实例。映射是用数据库中的MapStore实现持久化的。 如果微服务关闭,我们会丢失内存中的所有数据,分布式查询也不会返回任何结果。使用loadAllKeys()等通过MapStore初始化内存中的数据不是一种方法,因为我们在数据库中将有大量条目需要加载。