4

我正在使用 JBoss AS 6 编写 Java EE 应用程序,并且我有一个资源需要对给定参数的方法进行独占访问(第三方软件的某些接口)。目前我很顽皮(因为规范禁止它)并java.util.concurrent.ReentrantLock用于处理锁定。

现在我将多个 JBoss 应用程序服务器集群在一起,所以我需要一个可以跨集群中不同节点工作的解决方案。我想我至少有以下选择。

  1. 共享缓存 (Infinispan)
  2. JGroups
  3. 基于文件系统的锁定(可能很糟糕,但我们仍然依赖共享文件系统)
  4. 数据库
  5. 单例 EJB的?

理想情况下,我正在寻找一个高级 API,这样我就可以编写这样的 EJB 方法

public class MyEJBBean {

    private SharedLock lock;

    public void doSomethingWithSharedResource(String s) {
        lock.lock(); // blocks until shared resource is not used by anyone else
        try {
           // Use shared resource
        } 
        finally {
           lock.unlock();
        }
    }

我错过了任何选择吗?有没有人可以分享这种锁定机制的经验?

4

2 回答 2

2

理想情况下,我建议将第三方软件包装到仅在单个实例上运行的单独应用程序中。通过这种方式,您可以使用 EJB 单例处理锁定(我相信这@Singleton对您的场景没有帮助)并使用远程 EJB/WS 公开它。看起来这个软件有点讨厌(单线程?)所以拥有更多用户友好的 EJB 界面将是一个额外的好处。

想一想——如果整个系统一次只能访问一次库,为什么还要麻烦分发它呢?无论如何,始终最多只能使用一个实例。

如果你想坚持使用同构分布式系统(这通常不是一个坏主意),我建议使用SELECT FOR UPDATE. 我从未尝试过,但我认为在使用您的库(获得锁)之前发出这样的 SQL,然后让 EJB 容器提交事务(有效地释放锁)就可以了。

于 2011-03-28T16:41:38.903 回答
2

使用http://hadoop.apache.org/zookeeper/怎么样?它是分布式系统上一种非常轻量级的文件系统,是实现锁的良好解决方案。

看到这个:http ://hadoop.apache.org/zookeeper/docs/r3.1.2/recipes.html#sc_outOfTheBox

于 2011-03-28T16:56:18.693 回答