JBoss 7.1.1.Final — удаленный вызов EJB — java.lang.IllegalStateException: нет приемника EJB, доступного для обработки

У меня есть 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;
    }
}

сервер.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)

person sanssan    schedule 14.01.2013    source источник


Ответы (2)


Попробуйте удалить "глобальный" из 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 не рекомендуется, как объяснено здесь.

... . Итак, как видите, нам удалось оптимизировать некоторые операции с помощью клиентского API EJB для поиска/вызова EJB по сравнению с использованием проекта удаленного именования. Существуют и другие детали реализации клиентского API EJB (и, вероятно, могут быть добавлены другие), которые лучше, когда они используются для удаленных вызовов EJB в клиентских приложениях, по сравнению с проектом удаленного именования, который не обладает интеллектом для выполнения таких оптимизаций для EJB. призывы. Вот почему проект удаленного именования для удаленных вызовов EJB считается «устаревшим». ...

Вы можете проверить, как выполнять удаленные вызовы EJB с помощью клиентского API EJB здесь.

person Pablo Lascano    schedule 15.01.2013

Нашел....

Те, которые я использовал только для локальных машин. Разные экземпляры JBoss должны изменить имя поиска JNDI...

как

ejb:quote/quote.jar//QuoteFacadeEJB!com.xyz.life.service.ejb.QuoteFacade
person sanssan    schedule 15.01.2013
comment
Вы даже не смотрите на мой ответ, не так ли? - person Pablo Lascano; 17.01.2013