当前位置: 首页 > 知识库问答 >
问题:

JBoss 7:没有EJB接收器可用

端木震博
2023-03-14

我是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使用JNDI从远程客户端调用_sscc=t),我很确定会有jboss ejb客户端。在正确的地方。

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

endpoint.name=myAppEE/myAppEJBremote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=假remote.connections=默认remote.connection.default.host=localhostremote.connection.default.port=4447remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=假

它位于:

< code > myAppEJB \ EJB module \ 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);
}
...
}

servlet:

...

@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。

弗朗切斯科

共有3个答案

轩辕涵亮
2023-03-14

在类 MyAppServer委托中,您必须在以下方法中而不是在构造函数中实例化属性“会话”:

>

  • 获取我所有的数据By();

    getcountmyDataBy();

    获取服务消息();

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

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

  • 阴福
    2023-03-14

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

      < li>jboss-ejb-client xnio-nio < Li > JBoss-远程命名 < li>jboss-sasl jboss-transaction-ap JBoss-编组 JBoss-编组-河流

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

    Jboss 7.1:13:43:25,028 INFO[stdout](EJB default-6)Hello world 13:43:25,825 ERROR[org.jboss.remoting.remote.connection](删除"mycomputername"read-1)JBREM000200:远程连接失败:java.io.IOException:现有连接被远程主机强制关闭

    我的java ejb客户端:WARN[远程客户端endpoint任务2](ChannelAssociation.java:320)-收到不支持的消息,头0xffffffff

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

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

    Java-class path " $ JBOSS _ HOME/bin/client/JBOSS-client . jar;。/my-EJB-client . jar " com . test . my client

    丰俊艾
    2023-03-14

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

    尝试在组织.jboss.ejb.客户端包上启用 TRACE 日志级别。如果类路径中已有 log4j.属性,请包括以下行:

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

    这篇文章包括调试 JBoss EJB 客户端的其他线索。

     类似资料:
    • 我的EJBTest有问题。 我安装了WildFly并配置了用户管理和应用程序管理。 我编写了一个EJB 3.0并进行了部署: 之后,我编写了一个简单的客户端来连接它: 用户名和密码都是应用程序用户凭据,而不是管理!对吗? 我收到以下错误: 线程“main”java中出现异常。lang.IllegalStateException:EJBClient00025:没有可用于处理调用上下文组织的[appN

    • 我知道很多人已经询问了这个错误,但我仍然找不到解决方案,我按照本教程创建了一个远程客户端,访问驻留在Wildfly 10服务器上的Bean,该服务器运行在地址:localhost:8082。这是我的代码: 我的界面: 我的Bean: 我的远程客户端: 然后我还在项目的src/文件夹中添加了一个jboss-ejb-client.properties文件,如下所示: 我的操作与教程完全相同,但仍然会出

    • 我使用的debezium-connector:https://repo1.maven.org/maven2/io/debezium/debezium-connector-oracle/1.4.0.final/debezium-connector-oracle-1.4.0.final-plugin.tar.gz 我遵循了docker-compose的以下说明:https://github.com/c

    • 我正在尝试从运行在JBoss EAP 6的单独实例上的客户端服务器对运行在JBoss EAP 6的一个实例上的多个服务器进行远程调用。我已经配置了JBoss到JBoss的远程通信,并且已经阅读了范围内的EJB客户端上下文,但是两者似乎不兼容。目前,我配置了两个EJB接收器(每个远程服务器一个),但是当我尝试进行远程调用时,会出现初始化的上下文随机选择它将使用的EJB接收器。如果我有远程IP和端口,

    • 我正在将我的应用程序从JBoss7迁移到WildFly(V9.0.1),由于bean事务管理错误,它没有被部署。 下面是EventServiceImpl类。 请提供任何信息!

    • 我试图使用来自kafka的消息,源消息以Avro格式序列化(我使用了AWS模式注册表)。 连接器配置: 但是当我尝试配置接收器连接器时,它会出现以下错误。