目前我正在使用以下代码来查找普通 POJO 类的 EJB3 无状态会话 bean。 (我们使用的是 JEE5,所以我们无法在普通 POJO 类中注入无状态会话 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 http://docs.oracle.com/javase/6/docs/api/javax/naming/InitialContext.html提到以下内容:
An InitialContext
实例不与多个线程的并发访问同步。多个线程,每个线程操作不同的InitialContext
实例不需要同步。需要访问单个线程InitialContext
并发实例应该在它们之间同步并提供必要的锁定。
最后一句话证实了这一点:它不是线程安全的,并且每线程同步是必要的。在你特别的但是,在代码示例中,不需要同步,因为无论如何它都是在方法本地范围中创建的(即它绝对不在线程之间共享)。如果InitialContext
在您的特定代码示例中是一个实例变量,那么您必须添加synchronized
关键字到getEJB()
method.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)