Java:JNDI查找在线程内部运行时失败



关于使用Wildfly 18查找JNDI,我面临着一个相当奇怪的行为。我有一个简单的EJB:

package com.getronics.ejb;
import javax.ejb.Remote;
import javax.ejb.Local;
import javax.ejb.Stateless;
@Stateless
@Local(ICalculadoraLocal.class)
public class CalculadoraBean implements ICalculadoraLocal {
public int suma(int a, int b){
return a+b;
}
}

有一个简单的接口:

package com.getronics.ejb;
public interface ICalculadoraLocal{
int suma(int a, int b);
}

还有一个简单的JSP页面:

<html>
<body>
<%@ page import="java.util.Hashtable,javax.naming.*,com.getronics.ejb.*" %>
request: <%= request.getRequestURI()%><br>
<%
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");
final Context context = new InitialContext(jndiProperties);
ICalculadoraLocal calculadora = (ICalculadoraLocal)context.lookup("java:app/ejb-0.0.0.0.0.1/CalculadoraBean!com.getronics.ejb.ICalculadoraLocal");
int suma = calculadora.suma(2,2);
%>
context: <%= context%></br>
2+2= <%=suma%>
</body>
</html>

这很好:

request: /ejb/index.jsp
context: javax.naming.InitialContext@3e532295
2+2= 4

然而,当我尝试使用线程时,就像这样:

<html>
<body>
<%@ page import="java.util.Hashtable,javax.naming.*,com.getronics.ejb.*" %>
request: <%= request.getRequestURI()%><br>
<%
new Thread() {
public void run() {
try {
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");
final Context context = new InitialContext(jndiProperties);
ICalculadoraLocal calculadora = (ICalculadoraLocal)context.lookup("java:app/ejb-0.0.0.0.0.1/CalculadoraBean!com.getronics.ejb.ICalculadoraLocal");
int suma = calculadora.suma(2,2);
System.out.println("suma: " + suma);
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
%>
</body>
</html>

它抛出一个NameNotFoundException:

javax.naming.NameNotFoundException: java:app/ejb-0.0.0.0.0.1/CalculadoraBean!com.getronics.ejb.ICalculadoraLocal

关于为什么会发生这种情况,有什么想法吗?

似乎使用"global"而不是"app"可以使其工作:

ICalculadoraLocal calculadora = (ICalculadoraLocal)context.lookup("java:global/ear-0.0.0.0.0.1/ejb-0.0.0.0.0.1/CalculadoraBean!com.getronics.ejb.ICalculadoraLocal");

原因似乎是"app"、"module"one_answers"comp"的JNDI查找在这些线程中不起规范的作用。

您可以查看这些链接了解更多信息:

用户线程中的jndi查找失败

[jboss-as7-dev]从非EE线程访问java:comp/UserTransaction的问题

最新更新