当前,我正在使用以下代码为普通的POJO类查找EJB3无状态 session bean。 (我们在JEE5中,所以我们不能在必须使用查找的普通POJO类中注入(inject)无状态 session Bean)

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.apache.log4j.Logger;

public Object getEJB(String jndiName) {

                logger.debug("WEBSPHERE EJB Lookup : " + jndiName);
                String modifiedJndiName = "";
                Hashtable<Object, Object> properties = new Hashtable<Object, Object>();
                properties.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
                properties.put(Context.PROVIDER_URL, "iiop://localhost:2809");
                try {
                    Context context = new InitialContext(properties);
                    logger.debug("WEBSPHERE EJB Lookup Modified JNDI Name: " + modifiedJndiName);
                    return context.lookup("ejblocal:"+modifiedJndiName);
                }catch (NamingException ne) {
                    logger.debug("Naming Exception occurred :"+jndiName +">>>"+ne.getMessage());
                    logger.error(ne.getMessage(), ne);
                }

                return null;
            }

那么Context对象是ThredSafe吗?我应该为每个调用创建Context对象(如此代码段所示),还是可以对所有线程重用Context?

最佳答案

只要相关,通常都会在javadoc中提到有关线程安全的答案。实际上, InitialContext javadoc提到以下内容:



最后一句话证实了这一点:它不是线程安全的,因此必须进行每线程同步。但是,在您的特定代码示例中,由于同步始终是在方法本地作用域中创建的,因此不需要同步(即,绝对不会在线程之间共享)。如果在您的特定代码示例中InitialContext是实例变量,则必须将synchronized关键字添加到getEJB()方法中。

07-28 03:35
查看更多