Distributed Locking and Java EE
I'm writing a Java EE application using JBoss AS 6 and I have a resource that requires exclusive access (some interface to a third-party bit of software) to a method for a given parameter. Currently I'm being naughty (since the specification prohibits it) and using java.util.concurrent.ReentrantLock
to handle locking.
Now I'm clustering multiple JBoss application servers together so I need a solution that works across different nodes in the cluster. I think I have at least the following options.
- The Shared Cache (Infinispan)
- JGroups
- File System based locking (probably bad, but we rely on a shared file system anyway)
- Database
- Singleton EJB's?
Ideally, I'm looking for a high level API so I can write EJB methods like this
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();
}
}
Have I missed any options? Does anyone have any experience with this kind of locking mechanism that they can sha开发者_StackOverflow社区re?
Ideally, I would suggest wrapping the third-party software into a separate application running on just a single instance. This way you can handle locking using EJB singletons (I believe the @Singleton
won't help you in your scenario) and expose it using remote EJB/WS. Looks like this piece of software is a bit nasty (single-threaded?) so having more user-friendly EJB interface will be an additional benefit.
Think about it - if you can only access the library once at a time for the whole system, why bother distributing it? Always at most one instance will be able to use anyway.
If you want to stick with homogeneous distributed system (which isn't a bad idea in general), I would suggest database locking using SELECT FOR UPDATE
. I never tried it but I think issuing such an SQL before using your library (obtaining a lock) and letting EJB container to commit the transaction (effectively releasing the lock) afterwards will do the trick.
How about using http://hadoop.apache.org/zookeeper/ ? It's a kind of very light file system on distributed systems and good solution for implementing lock.
See this: http://hadoop.apache.org/zookeeper/docs/r3.1.2/recipes.html#sc_outOfTheBox
精彩评论