Java: JNDI Lookup завершается ошибкой при запуске внутри потока - PullRequest
0 голосов
/ 16 марта 2020

Я сталкиваюсь с довольно странным поведением в отношении поиска JNDI с использованием Wildfly 18. У меня есть один простой 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

Есть идеи, почему это может произойти?

1 Ответ

1 голос
/ 17 марта 2020

Кажется, что использование "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");

Причина, по-видимому, в том, что JNDI-поиск "app", "module" и "comp" выиграл " работать в этих потоках, как для спецификации.

Вы можете проверить эти ссылки для получения дополнительной информации:

jndi-поиск завершается неудачей в пользовательском потоке

[jboss-as7-dev] Проблема с доступом к java: comp / UserTransaction из потоков EE

...