JBoss 7.1.1.Final - EJB远程调用 - java.lang.IllegalStateException:没有可用于处理的EJB接收器

时间:2013-01-14 17:55:07

标签: ejb jboss7.x remote-access illegalstateexception

我有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 Impl

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;
    }
}

的server.log

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)

2 个答案:

答案 0 :(得分: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调用,如here所述。

  

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

您可以使用EJB客户端API here检查如何进行远程EJB调用。

答案 1 :(得分:0)

发现它......

我仅用于本地计算机的那些。差异JBoss实例,应该更改JNDI查找名称...

喜欢

ejb:quote/quote.jar//QuoteFacadeEJB!com.xyz.life.service.ejb.QuoteFacade