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

Java:JNDI查找在线程内运行时失败,java,thread-safety,wildfly,jndi,Java,Thread Safety,Wildfly,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 ICalculadoraLo

关于使用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>
但是,当我尝试使用线程时,如下所示:

<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>
关于为什么会发生这种情况有什么想法吗?

似乎使用“全局”而不是“应用”可以让它工作:

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");
原因似乎是JNDI对“app”、“module”和“comp”的查找在这些线程中无法按照规范进行

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

似乎使用“全局”而不是“应用”可以让它工作:

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");
原因似乎是JNDI对“app”、“module”和“comp”的查找在这些线程中无法按照规范进行

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


问题的原因在其他地方,而不是您展示给我们的狙击手。我在Wildfly 18中通过JNDI查找类,在线程内部和外部都没有问题。我建议您列出整个JNDI上下文的内容,然后查看其中的内容。呃,不。所有JNDI查找都在线程内运行。您应该检查我的示例,看看“不可能的原因”有多可能。您的回答证明了我的观点。它与线程无关,一切都与
app
global
有关。我很困惑,为什么您首先要在一个单独的线程中运行此代码。问题的原因是在其他地方,而不是在您向我们展示的sniplets中。我在Wildfly 18中通过JNDI查找类,在线程内部和外部都没有问题。我建议您列出整个JNDI上下文的内容,然后查看其中的内容。呃,不。所有JNDI查找都在线程内运行。您应该检查我的示例,看看“不可能的原因”有多可能。您的回答证明了我的观点。它与线程无关,一切都与
app
global
有关。我不明白为什么您首先要在一个单独的线程中运行此代码。切题来说,找到的唯一官方文档是:“可移植JNDI语法”-其中说明了
global
module
app
之间的区别。但这一切都是在10多年前的EJB环境中进行的。切题地说,发现的唯一官方文档是:“可移植的JNDI语法”-其中说明了
global
module
app
之间的区别。但这一切都是在10多年前的EJB环境中进行的。
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");