开发者社区> 问答> 正文

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

关于为何会发生这种情况的任何想法?

问题来源:Stack Overflow

展开
收起
montos 2020-03-22 11:37:25 884 0
1 条回答
写回答
取消 提交回答
  • 似乎使用“ 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");
    

    原因似乎是“ Napp查找”“ app”,“ module”和“ comp”在规范中不适用于那些线程。

    您可以检查以下链接以获取更多信息: https://developer.jboss.org/thread/173179 https://lists.jboss.org/pipermail/jboss-as7-dev/2011-June/002292.html

    回答来源:Stack Overflow

    2020-03-22 11:38:16
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
多IO线程优化版 立即下载