Dear all,
According to the Core
J2EE Patterns, ServiceLocator is supposed to cache EJBHome objects.
Now suppose I work with stateful session beans in EJB 3.0. I don't have home objects any more, so I'd cache the object returned by context.lookup() (see code below). But that means that several users would have access to the same stateful bean (the cached one), which is not what we want.
How to solve this issue in the context of EJB 3.0 ?
public class ServiceLocator {
/**
* Singleton Instance of this class
*/
private static ServiceLocator serviceLocator = null;
/**
* InitialContext object
*/
InitialContext context = null;
/**
* Cache where the objects can be stored for later
* retrieval.
* This enhances the performance.
*/
HashMap serviceCache = null;
/**
* Constructor to initialize the class
*
* @exception NamingException In case an exception is
* generated
*/
public ServiceLocator() throws NamingException {
// Start the initial context
context = new InitialContext();
// Initialize the HashMap to store 5 objects
serviceCache = new HashMap(5);
}
/**
* Returns the singleton instance
*
* @exception NamingException In case an exception is
* generated
* @return Singleton Instance
*/
public synchronized static ServiceLocator getInstance() throws NamingException {
if (serviceLocator == null) {
// If the object is not created, then create it
serviceLocator = new ServiceLocator();
}
// Return the singleton instance
return serviceLocator;
}
/**
* This is the method that returns the service
*
* @param jndiName JNDI Lookup needed for invoking the
* service
* @exception NamingException In case an exception is
* generated
* @return Service Object
*/
public Object getService(
String jndiName) throws NamingException {
if (!serviceCache.containsKey(jndiName)) {
// If the object is not saved in the cache, then do a
//lookup and save it
serviceCache.put(jndiName, context.lookup(jndiName));
}
// Return the required object
return serviceCache.get(jndiName);
}
}
Thank you,
Sorin