1

我确实有 2 个 JBoss stanalon 实例正在运行。1 个充当服务器,另外 1 个充当客户端。

服务器:

远程接口

package com.xyz.life.service.ejb;

import java.io.Serializable;
import java.rmi.RemoteException;
import javax.ejb.EJB;
import javax.ejb.Remote;

@Remote
public interface QuoteFacade extends Serializable{
    public boolean isAlive()    throws RemoteException;
}

EJB 实现

package com.xyz.life.common.component.ejb.services;

import java.rmi.RemoteException;
import javax.ejb.Remote;
import javax.ejb.Stateless;

@Stateless(mappedName = "QuoteFacadeEJB")
@Remote(QuoteFacade.class)
public class QuoteFacadeEJB extends CommonSessionBean implements QuoteFacade {
    private static final long serialVersionUID = -8788783322280644881L;

    @Override
    public boolean isAlive() throws RemoteException {
        return true;
    }
}

服务器日志

16:40:25,012 INFO  [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-4) JNDI bindings for session bean named QuoteFacadeEJB in deployment unit subdeployment "quote.jar" of deployment "quote.ear" are as follows:
        java:global/quote/quote.jar/QuoteFacadeEJB!com.xyz.life.service.ejb.QuoteFacade
        java:app/quote.jar/QuoteFacadeEJB!com.xyz.life.service.ejb.QuoteFacade
        java:module/QuoteFacadeEJB!com.xyz.life.service.ejb.QuoteFacade
        java:jboss/exported/quote/quote.jar/QuoteFacadeEJB!com.xyz.life.service.ejb.QuoteFacade
        java:global/quote/quote.jar/QuoteFacadeEJB
        java:app/quote.jar/QuoteFacadeEJB
        java:module/QuoteFacadeEJB

客户

public void testClient() {
        try {
            Hashtable<String, Object> jndiProps = new Hashtable<String, Object>();
            jndiProps.put(Context.URL_PKG_PREFIXES, JNDINames.JBOSS_CLIENT_NAMING_PREFIX);
            jndiProps.put("jboss.naming.client.ejb.context", true);
            Context ctx = new InitialContext(jndiProps);

            String name = "ejb:global/quote/quote.jar/QuoteFacadeEJB!com.ge.life.annuity.service.ejb.QuoteFacade";
            /*
            "ejb:global/quote/quote.jar/QuoteFacadeEJB!com.ge.life.annuity.service.ejb.QuoteFacade",
            "ejb:app/quote.jar/QuoteFacadeEJB!com.ge.life.annuity.service.ejb.QuoteFacade",
            "ejb:jboss/exported/quote/quote.jar/QuoteFacadeEJB!com.ge.life.annuity.service.ejb.QuoteFacade"
            */

            Object ref = ctx.lookup(name);
            QuoteFacade quoteFacade = (QuoteFacade) ref;
            LOGGER.debug("isAlive : " + quoteFacade.isAlive());
        } catch (Exception e) {
            LOGGER.error("Remote Client Exception : ", e);
        }
    }

服务器端没有错误/日志。客户端,它失败并出现以下错误:

java.lang.IllegalStateException: No EJB receiver available for handling [appName:global,modulename:quote,distinctname:quote.jar] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@200cae

    at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:584)

    at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:119)

    at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:181)

    at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:136)

    at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:121)

    at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:104)

    at $Proxy10.isAlive(Unknown Source)

我尝试不使用属性文件:

private static QuoteFacade connectToStatelessBean(String name) throws NamingException {  

        Properties jndiProperties = new Properties();  
        jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");  
        jndiProperties.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");  
        jndiProperties.put(javax.naming.Context.PROVIDER_URL, "remote://localhost:4447");  
        jndiProperties.put(javax.naming.Context.SECURITY_PRINCIPAL, "admin");  
        jndiProperties.put(javax.naming.Context.SECURITY_CREDENTIALS, "Pass1234");  
        final Context context = new InitialContext(jndiProperties);  

        return (QuoteFacade) context.lookup(name);  
    }  
    public static void testLocal() {  
        String[] JNDINAME1 = {  

        "ejb:global/quote/quote.jar/QuoteFacadeEJB!com.ge.life.annuity.service.ejb.QuoteFacade",  
        "ejb:app/quote.jar/QuoteFacadeEJB!com.ge.life.annuity.service.ejb.QuoteFacade",  
        "ejb:module/QuoteFacadeEJB!com.ge.life.annuity.service.ejb.QuoteFacade",  
        "ejb:jboss/exported/quote/quote.jar/QuoteFacadeEJB!com.ge.life.annuity.service.ejb.QuoteFacade",  
        "ejb:global/quote/quote.jar/QuoteFacadeEJB",  
        "ejb:app/quote.jar/QuoteFacadeEJB",  
        "ejb:module/QuoteFacadeEJB"  
    };  
    for(int i=0;i<JNDINAME1.length;i++){  
        try {  
            QuoteFacade test1 = connectToStatelessBean(JNDINAME1[i]);  
            LOGGER.error("DSLKAJDLAS : " + test1.isAlive());  
        } catch (Exception e) {  
            LOGGER.error("DSLKAJDLAS : " , e);  
        }  

    }  
    LOGGER.info("Done - SANSSAN!!!!!!!!");  
}  

这一次,不同的例外:

14.01.2013 17:40:37.627 [ERROR] - EJBClient - DSLKAJDLAS :   
javax.naming.NamingException: JBAS011843: Failed instantiate InitialContextFactory org.jboss.naming.remote.client.InitialContextFactory from classloader ModuleClassLoader for Module "deployment.quote.war:main" from Service Module Loader  
    at org.jboss.as.naming.InitialContextFactoryBuilder.createInitialContextFactory(InitialContextFactoryBuilder.java:64)  
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:681)  
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)  
    at javax.naming.InitialContext.init(InitialContext.java:242)  
    at javax.naming.InitialContext.><init>(InitialContext.java:216)  
    at com.xyz.life.test.EJBClient.connectToStatelessBean(EJBClient.java:208)  
    at com.xyz.life.test.EJBClient.testLocal(EJBClient.java:225)  
    at com.xyz.life.test.EJBClient.test(EJBClient.java:172)  
    at com.xyz.life.common.web.struts.plugin.FrameworkStartupPlugIn.init(FrameworkStartupPlugIn.java:99)  
    at org.apache.struts.action.ActionServlet.initModulePlugIns(ActionServlet.java:1158)  
    at org.apache.struts.action.ActionServlet.init(ActionServlet.java:473)  
    at javax.servlet.GenericServlet.init(GenericServlet.java:242)  
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1202)  
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1102)  
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3655)  
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:3873)  
    at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:90)  
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)  
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)  
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)  
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)  
    at java.lang.Thread.run(Thread.java:722)
4

2 回答 2

3

尝试从中删除“全局” name

String name =
  "ejb:quote/quote.jar/QuoteFacadeEJB!com.xyz.life.service.ejb.QuoteFacade"

此外,您的包名称应该是com.xyz.life.service.ejb(如服务器日志所示)而不是com.ge.life.annuity.service.ejb.

无论如何,不​​鼓励使用远程命名项目进行远程 EJB 调用,如此所述。

... . 如您所见,我们已经设法通过使用 EJB 客户端 API 进行 EJB 查找/调用而不是使用远程命名项目来优化某些操作。还有其他 EJB 客户端 API 实现细节(可能会添加更多细节),当它用于客户端应用程序中的远程 EJB 调用时,它们优于远程命名项目,后者不具备为 EJB 执行此类优化的智能调用。这就是为什么远程 EJB 调用的远程命名项目被认为是“弃用”的原因。...

您可以在此处查看如何使用 EJB 客户端 API 进行远程 EJB 调用。

于 2013-01-15T13:53:30.427 回答
0

找到了....

我只用于本地机器的那些。不同的 JBoss 实例,应该更改 JNDI 查找名称...

ejb:quote/quote.jar//QuoteFacadeEJB!com.xyz.life.service.ejb.QuoteFacade
于 2013-01-15T16:49:51.183 回答