我正在使用JBoss作为6编写一个Java应用程序,而且我有一个资源,需要对给定参数的方法进行独占访问(与第三方软件的一些接口)。目前,我正在调皮(自规范禁止它)和使用java.util.concurrent.ReentrantLock处理锁定。
现在,我将多个JBoss应用服务器集群在一起,因此我需要一个跨集群中不同节点工作的解决方案。我想我至少有以下几个选择。
理想情况下,我正在寻找一个高级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();
}
}我错过了什么选择吗?有没有人有这种锁定机制的经验,他们可以分享?
发布于 2011-03-28 16:41:38
理想情况下,我建议将第三方软件封装到一个单独的应用程序中,仅在一个实例上运行。通过这种方式,您可以使用EJB处理锁定(我相信@Singleton在您的场景中不会对您有所帮助),并使用远程EJB/WS公开它。看起来这个软件有点恶心(单线程?)因此,拥有更多用户友好的EJB界面将是一个额外的好处。
想想看--如果您一次只能访问整个系统的库一次,那么为什么还要分发它呢?无论如何,总是最多有一个实例能够使用。
如果您想坚持使用同构的分布式系统(这在一般情况下并不是个坏主意),我建议使用SELECT FOR UPDATE进行数据库锁定。我从未尝试过这种方法,但我认为在使用库(获取锁)之前发出这样的SQL并让EJB容器提交事务(实际上是释放锁)将起作用。
发布于 2011-03-28 16:56:18
使用http://hadoop.apache.org/zookeeper/怎么样?它是分布式系统上一种非常轻的文件系统,是实现锁的良好解决方案。
参见:outOfTheBox
https://stackoverflow.com/questions/5461829
复制相似问题