Jakarta ee 将EJB本地客户端从JBoss 6迁移到Wildfly 10

Jakarta ee 将EJB本地客户端从JBoss 6迁移到Wildfly 10,jakarta-ee,jboss,java-ee-7,wildfly-10,Jakarta Ee,Jboss,Java Ee 7,Wildfly 10,在从JBoss 6迁移到WildFly 10的过程中,当获取对遗留应用程序中会话bean的引用时,我面临以下JNDI查找问题 以下代码在JBoss6中工作,它获取对会话bean“OMGenEJB”的引用,然后使用该会话bean获取代理对象“genhome”以与bean交互 try { InitialContext ic = new InitialContext(); Object objRef = ic.lookup("ejb/OMGenEJB");

在从JBoss 6迁移到WildFly 10的过程中,当获取对遗留应用程序中会话bean的引用时,我面临以下JNDI查找问题

以下代码在JBoss6中工作,它获取对会话bean“OMGenEJB”的引用,然后使用该会话bean获取代理对象“genhome”以与bean交互

    try {
        InitialContext ic = new InitialContext();
        Object objRef = ic.lookup("ejb/OMGenEJB");
        OMGenEJBHome genhome = 
          (OMGenEJBHome) PortableRemoteObject.narrow ( objRef, OMGenEJBHome.class );

ejbhome接口是OMGenEJBHome

EJB实现类是OMGenBean

bean在“ejb jar.xml”中定义如下:

  <session >
     <ejb-name>OMGenEJB</ejb-name>
     <home>com.irisel.oms.ejb.interfaces.OMGenEJBHome</home>
     <remote>com.irisel.oms.ejb.interfaces.OMGenEJB</remote>
     <service-endpoint>com.irisel.oms.ws.OMBrowserEndpoint</service-endpoint>
     <ejb-class>com.irisel.oms.ejb.browser.OMGenBean</ejb-class>
     <session-type>Stateless</session-type>
     <transaction-type>Bean</transaction-type>
  </session>
下面是对打印JNDI条目的修改,如在客户机中看到的,包括在初始上下文和“java:comp/env”中

原来初始上下文是“java:”,因为Mail和TransactionManager的JNDI名称分别为“java:/Mail”和“java:/TransactionManager”。但是,我希望相对路径是相对于java:comp/env的

接下来,我们看到条目“ejb”:

我的问题是

  • 为什么“java:comp/env”不再是默认上下文,而是“java:”
  • 为什么“ejb/OMGenEJB”的查找也会在修改代码中失败

    23:23:51680信息[stdout](默认任务-16)异常:WFLYNAM0062:无法查找env/ejb/OMGenEJB

  • 如果我们尝试查找“ejb”,则查找工作正常

    所以我也试过这个:

        try {
            logger.info("Connecting to ejb/OMGenEJB");
            InitialContext ic = new InitialContext();
            NamingEnumeration<NameClassPair> list = ic.list("");
            while (list.hasMore()) {
              System.out.println("ic entry:"+list.next().getName());
            }
            Context envCtx = (Context)ic.lookup("java:comp/env/ejb");
            list = envCtx.list("");
            while (list.hasMore()) {
                  System.out.println("envCtx entry:"+list.next().getName());
            }
            Object objRef2 = envCtx.lookup("OMGenEJB");
            logger.info("Narrowing to class OMGenEJBHome #"+OMGenEJBHome.class.hashCode());
            OMGenEJBHome genhome = (OMGenEJBHome)PortableRemoteObject.narrow(objRef2, OMGenEJBHome.class);
    
            //browser = genhome.create();
            //className = browser.getClassNames();
    
            genejb = genhome.create();
            appvo = (AppVO) AppVO.readObject64(this.genejb.exec("getApp",null,null));
    
        } catch (Exception ex) {
            System.out.println("Exception :"+ ex.getMessage());
            ConfigException ce = new ConfigException("Cannot initialize remote EJB client");
            ce.initCause(ex);
            throw ce;
        } 
    
    有效的解决方案是使用全局或应用程序名称,问题是它包含ear名称和版本

    "java:global/HolmesBSS-2.0/HolmesEJB-2.0/OMGenEJB!com.irisel.oms.ejb.interfaces.OMGenEJBHome"
    "java:app/HolmesEJB-2.0/OMGenEJB!com.irisel.oms.ejb.interfaces.OMGenEJBHome"
    
    这些不起作用

    "java:module/OMGenEJB!com.irisel.oms.ejb.browser.OMGenBean"
    "java:module/OMGenEJB!com.irisel.oms.ejb.interfaces.OMGenEJBHome"
    "java:comp/env/ejb/OMGenEJB"
    
    我想与您确认一下,您是否认为这符合Java-7规范


    谢谢

    Java EE 7的可移植JNDI名称的形式如下:

    java:global/<app-name>/<module-name>/<bean-name>!<fully-qualified-bean-interface-name>
    
    注意:您不能使用ejb-jar.xml中的“mappedName”绑定到不同的JNDI名称,因为Wildfly不允许它。Wildfly只允许上述形式

        try {
            logger.info("Connecting to ejb/OMGenEJB");
            InitialContext ic = new InitialContext();
            NamingEnumeration<NameClassPair> list = ic.list("");
            while (list.hasMore()) {
              System.out.println("ic entry:"+list.next().getName());
            }
            Context envCtx = (Context)ic.lookup("java:comp/env/ejb");
            list = envCtx.list("");
            while (list.hasMore()) {
                  System.out.println("envCtx entry:"+list.next().getName());
            }
            Object objRef2 = envCtx.lookup("OMGenEJB");
            logger.info("Narrowing to class OMGenEJBHome #"+OMGenEJBHome.class.hashCode());
            OMGenEJBHome genhome = (OMGenEJBHome)PortableRemoteObject.narrow(objRef2, OMGenEJBHome.class);
    
            //browser = genhome.create();
            //className = browser.getClassNames();
    
            genejb = genhome.create();
            appvo = (AppVO) AppVO.readObject64(this.genejb.exec("getApp",null,null));
    
        } catch (Exception ex) {
            System.out.println("Exception :"+ ex.getMessage());
            ConfigException ce = new ConfigException("Cannot initialize remote EJB client");
            ce.initCause(ex);
            throw ce;
        } 
    
    00:35:52,048 INFO  [com.irisel.oms.olapi.CLEJBBrowser] (default task-2) Connecting to ejb/OMGenEJB
    00:35:52,823 INFO  [stdout] (default task-2) ic entry:Mail
    
    00:35:53,123 INFO  [stdout] (default task-2) ic entry:TransactionManager
    
    00:35:53,992 INFO  [stdout] (default task-2) envCtx entry:OMBrowserEJB
    
    00:35:54,314 INFO  [stdout] (default task-2) envCtx entry:OMGenEJB
    
    00:36:25,649 INFO  [stdout] (default task-2) Exception :WFLYNAM0062: Failed to lookup env/ejb/OMGenEJB
    
    00:36:25,650 ERROR [stderr] (default task-2) com.irisel.util.ConfigException: Cannot initialize remote EJB client
    
    00:36:25,650 ERROR [stderr] (default task-2)    at com.irisel.oms.olapi.CLEJBBrowser.init2(CLEJBBrowser.java:82)
    ...
    00:36:25,671 ERROR [stderr] (default task-2) Caused by: javax.naming.NamingException: WFLYNAM0062: Failed to lookup env/ejb/OMGenEJB [Root exception is java.lang.RuntimeException: javax.naming.NameNotFoundException: ejb/OMGenEJB -- service jboss.naming.context.java.ejb.OMGenEJB]
    
    00:36:25,671 ERROR [stderr] (default task-2)    at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:157)
    
    ... ... 39 more
    
    00:36:25,672 ERROR [stderr] (default task-2) Caused by: java.lang.RuntimeException: javax.naming.NameNotFoundException: ejb/OMGenEJB -- service jboss.naming.context.java.ejb.OMGenEJB
    
    00:36:25,672 ERROR [stderr] (default task-2)    at org.jboss.as.ejb3.deployment.processors.EjbLookupInjectionSource$1.getReference(EjbLookupInjectionSource.java:99)
    
    00:36:25,672 ERROR [stderr] (default task-2)    at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:143)
    
    00:36:25,676 ERROR [stderr] (default task-2)    ... 44 more
    
    00:36:25,676 ERROR [stderr] (default task-2) Caused by: javax.naming.NameNotFoundException: ejb/OMGenEJB -- service jboss.naming.context.java.ejb.OMGenEJB
    
    00:36:25,676 ERROR [stderr] (default task-2)    at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:106)
    
    00:36:25,677 ERROR [stderr] (default task-2)    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:207)
    
    00:36:25,677 ERROR [stderr] (default task-2)    at org.jboss.as.naming.InitialContext$DefaultInitialContext.lookup(InitialContext.java:235)
    
    00:36:25,677 ERROR [stderr] (default task-2)    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:193)
    
    00:36:25,677 ERROR [stderr] (default task-2)    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:189)
    
    00:36:25,677 ERROR [stderr] (default task-2)    at javax.naming.InitialContext.lookup(InitialContext.java:417)
    
    00:36:25,677 ERROR [stderr] (default task-2)    at javax.naming.InitialContext.lookup(InitialContext.java:417)
    
    00:36:25,677 ERROR [stderr] (default task-2)    at org.jboss.as.ejb3.deployment.processors.EjbLookupInjectionSource$1.getReference(EjbLookupInjectionSource.java:81)
    
    00:36:25,677 ERROR [stderr] (default task-2)    ... 45 more
    
    "java:global/HolmesBSS-2.0/HolmesEJB-2.0/OMGenEJB!com.irisel.oms.ejb.interfaces.OMGenEJBHome"
    "java:app/HolmesEJB-2.0/OMGenEJB!com.irisel.oms.ejb.interfaces.OMGenEJBHome"
    
    "java:module/OMGenEJB!com.irisel.oms.ejb.browser.OMGenBean"
    "java:module/OMGenEJB!com.irisel.oms.ejb.interfaces.OMGenEJBHome"
    "java:comp/env/ejb/OMGenEJB"
    
    java:global/<app-name>/<module-name>/<bean-name>!<fully-qualified-bean-interface-name>
    
    <application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" version="6">
        <application-name>myApp</application-name>
    </application>
    
    <ejb-jar xmlns = "http://java.sun.com/xml/ns/javaee" 
             version = "3.1"
             xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd">
        <module-name>myModule</module-name>
    </ejb-jar>
    
    java:global/myApp/myModule/OMGenEJB!com.irisel.oms.ejb.interfaces.OMGenEJBHome