【问题标题】:JBoss 7: No EJB receiver availableJBoss 7:没有可用的 EJB 接收器
【发布时间】:2012-07-09 06:48:19
【问题描述】:

我是 JBoss 7 的新手。我面临着奇怪的行为。有时,当我尝试调用会话 bean 时,会遇到以下异常:

com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract java.util.List myServlet.getData() throws myException' threw an unexpected exception: java.lang.IllegalStateException: No EJB receiver available for handling [appName:myAppNameEE,modulename:myModuleEJB,distinctname:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@3e23bd28

这通常发生在从 Eclipse 运行我的 GWT 应用程序时。异常并不总是发生。有时它发生的次数比其他次数少。有时,每次我调用会话 bean 时都会发生这种情况,这很痛苦。我阅读了教程(https://docs.jboss.org/author/display/AS71/EJB+invocations+from+a+remote+client+using+JNDI?_sscc=t),我很确定有 jboss- ejb-client.properties 在正确的位置。

我的 jboss-ejb-client 看起来像:

endpoint.name=myAppEE/myAppEJB remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false remote.connections=default remote.connection.default.host=localhost remote.connection.default.port = 4447 remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false

它位于:

myAppEJB\ejbModule\com\myApp\ejb\conf

业务代表:

public class myAppServerDelegate extends ServerDelegate{

private Logger logger = Logger.getLogger(myAppServerDelegate.class.getName());
private myAppRemote theSession = null;

public myAppServerDelegate() throws Exception {

    try {
        theSession = (myAppRemote) getJndiContext().lookup(getJindiLookupName(myAppServerDelegate.class, myAppRemote.class));
    } catch (NamingException e) {
        throw (e);
    }
}

public List<myDataDTO> getAllmyDataBy(String a, String b,
        String c, String d,Integer e,
        Integer f) throws ServerDelegateException {

        return theSession.getAllmyDataBy(a, b, c, d,e,f);
}

public Integer getCountmyDataBy(String a, String b, String c, String d) throws ServerDelegateException {

    return theSession.getCountmyDataBy(a, b, c, d);
}
...

public String getServiceMessage() {

    return theSession.getServiceMessage();
}

...
}

会话 bean:

@Stateless

public class myAppSession implements myAppRemote {

private Logger logger = Logger.getLogger(myAppSession.class.getName());
@PersistenceContext
protected EntityManager entityManager;
@EJB
private myAppHomeLocal beanmyApp;

...

public String getServiceMessage() {

    return "MESSAGGIODISERVIZIO";
}

public List<myDataDTO> getAllmyDataBy(String a,String b,
        String c, String d,Integer e,
        Integer f) throws ServerDelegateException {

    logger.info("myAppSession.getAllmyDataBy.");
    List<myData> entityList = findByParms(a, b, c, d,e,f);
    return myDataAssemblyDTO.getmyDataDTOList(entityList);
}

public Integer getCountmyDataBy(String a,String b, String c, String d) throws ServerDelegateException {

    return findByParmsCount(a, b, c, d);
}
...
}

小服务程序:

...

@SuppressWarnings("serial")

公共类 MyGenericServiceImpl 扩展 RemoteServiceServlet 实现 MyGenericService {

private MyAppServerDelegate myAppServerDelegate = null;

public MyGenericServiceImpl() throws Exception{
    super();
    myAppServerDelegate = new MyAppServerDelegate();
}

private MyAppServerDelegate getDelegate()    {
    return myAppServerDelegate;
}

private myGWTException buildLocalExceptionFromServerException(ServerDelegateException sde)    {
    myGWTException x = new myGWTException();
    x.setParms(sde.guiMessage,sde.timestamp,sde.tipoEvento);
    return x;
}

@Override
public PagingLoadResult<myDataBean> getAllmyDataBy(String a, String b, String c, PagingLoadConfig plc) throws MyGWTException {
    try    {
        String cs = ((UserSessionBean)this.getThreadLocalRequest().getSession().getAttribute("user")).getCodiceStudio();
        List<myDataBean> tsb = MyDataClientAssembly.getMyDataBeanList(myAppServerDelegate.getAllmyDataBy(cs, a, b, c, plc.getOffset(), plc.getLimit()));
        return new BasePagingLoadResult<MyDataBean>(tsb, plc.getOffset(), myDataServerDelegate.getCountmyDataBy(cs, a, b, c));
    } catch (ServerDelegateException sde)    {
        throw buildLocalExceptionFromServerException(sde);
    }
}

@Override
public String getServiceMessage() {
    return getDelegate().getServiceMessage();
}

@Override
public Integer getCountmyDataBy(String a, String b, String c) throws AmbrogioGWTException {
    try    {
        String cs = ((UserSessionBean)this.getThreadLocalRequest().getSession().getAttribute("user")).getCs();
        return myAppServerDelegate.getCountmtDataBy(cs, a, b, c);
    } catch (ServerDelegateException sde)    {
        throw buildLocalExceptionFromServerException(sde);
    }
}
}

服务器委托:

public class ServerDelegate {

static public String getJindiLookupName( Class<?> theBeanClass, Class<?> theSessionClass) throws NamingException    {
    String jbossServerName = System.getProperty("jboss.server.name");
    if (jbossServerName== null ||  "".equals(jbossServerName)){
        return "myAppEE/myAppEJB/"+ theBeanClass.getSimpleName() + "!" + theSessionClass.getName();
    }else{
        return "java:global/myAppEE/myAppEJB/" + theBeanClass.getSimpleName() + "!" + theSessionClass.getName();
    }       
}

static public Context getJndiContext() throws NamingException    {
    System.out.println("ServerDelegate.getJndiContext");
    final Properties jndiProperties = new Properties();
    String jbossServerName = System.getProperty("jboss.server.name");
    if (jbossServerName== null ||  "".equals(jbossServerName)){
        jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, org.jboss.naming.remote.client.InitialContextFactory.class.getName());
        jndiProperties.put(Context.PROVIDER_URL, "remote://localhost:4447");
        jndiProperties.put("jboss.naming.client.ejb.context", true);
jndiProperties.put("jboss.naming.client.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT", "false");
        }             
    return new InitialContext(jndiProperties);       
    }
}

我不知道发生了什么。 TIA。

弗朗西斯科

【问题讨论】:

  • 我更深入地研究了这个问题。当我在 JBoss 下部署 gwt .war 和 ejb .jar 作为 .ear 模块时,一切正常。但是,如果我在 Eclipse 的嵌入式 Jetty 下运行 gwt 模块,在 JBoss 下运行 ejb 模块,我会得到 No EJB Receiver 异常。
  • 有人吗?也许我缺少一些信息?

标签: ejb jboss7.x


【解决方案1】:

这可能是使用本地与远程接口的问题或连接问题。

尝试在org.jboss.ejb.client 包上启用TRACE 日志级别。如果您的类路径中已经有 log4j.properties,请包含以下行:

log4j.logger.org.jboss.ejb.client=TRACE

This post 包含调试 JBoss EJB 客户端的其他线索。

【讨论】:

    【解决方案2】:

    我必须在我的 mavens pom.xml 文件中包含一个依赖项列表。其中包括

    1. jboss-ejb-client
    2. xnio-nio
    3. jboss-远程命名
    4. jboss-sasl
    5. jboss-transaction-ap
    6. jboss 编组
    7. jboss-marshalling-river

    我能够成功地从我的独立 java 客户端发出远程请求,但是我确实看到了以下问题

    Jboss 7.1: 13:43:25,028 INFO [stdout](EJB 默认 - 6)Hello world 13:43:25,825 错误 [org.jboss.remoting.remote.connection](远程处理“mycomputername”读取-1)JBREM000200:远程连接失败:java.io.IOException:现有连接被远程主机强行关闭

    我的 java ejb 客户端: WARN [Remoting "client-endpoint" task-2] (ChannelAssociation.java:320) - 收到不支持的消息,标头为 0xffffffff

    阅读网上的人似乎已经通过更新某些jar的版本解决了这个问题。但是,我还没有找到一个成功的解决方案。

    更新:在部署独立的 ejb 客户端时,我在类路径中包含了 jboss-client.jar。效果很好。

    java -classpath "$JBOSS_HOME/bin/client/jboss-client.jar;./my-ejb-client.jar" com.test.Myclient

    【讨论】:

      【解决方案3】:

      在 MyAppServerDelegate 类中,您必须在以下方法中而不是在构造函数中实例化属性“theSession”:

      • getAllmyDataBy();

      • getCountmyDataBy();

      • getServiceMessage();

      Session方法调用的结果应该存放在一个临时变量中,然后调用getJndiContext().close(),然后返回临时值。

      每个连接都必须显式关闭。实际上,当达到允许的最大连接数时会发生异常。

      【讨论】:

        猜你喜欢
        • 2013-02-28
        • 2012-10-05
        • 1970-01-01
        • 2017-04-19
        • 1970-01-01
        • 2012-09-08
        • 2016-07-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多