有两台机一台配左Tomcat一台就配左Jboss(EJB),Tomcat部机一开始可以正常调用EJB远程远程接口,但是当重起过JBOSS之后,就远程调用出错。如果Tomcat和Jboss是在同一台机器上就不会出现这样的问题。

解决方案 »

  1.   

    是web调用EJB,因为些历史原因,EJB的包也一并放了在Tomcat的LIB里面
      

  2.   

    key value of java.rmi.ConnectException: Connection refused to host: 192.168.2.118; nested exception is:
            java.net.ConnectException: Connection refused: connect not found!就这么短短的两行
      

  3.   

    有可能和本机host有关系~ 还有启动JBoss时指定 hostname 试一试
      

  4.   

    Tomcat要是没有远程访问过EJB的话,我JBOSS怎么开关都没问题,但只要访问过一次后,只要重起一下Jboss就会报错。
      

  5.   

    是不是你缓存了从 tomcat 到 jboss 的连接或者你缓存了 home 或 biz interface 对象?如果缓存了 JNDI Context, 可以考虑在失败时重新 new 一个 InitialContext 再试一次,不过 home/biz interface 是不能缓存的。
      

  6.   

    看了大家的回复,我回去做了一个最简单的HelloWorld,来测试。开始在JBOSS上部署HelloWorld的EJB,在另外的TOMCAT上放个远程访问的客户端,都部署成功。1. 在TOMCAT部署的客户端能够正常返回“HelloWorld”;
    2. 吧JBOSS关了以后,立刻重开(RESTART);
    3. 刷新TOMCAT部署的客户端的页面,报错lookup(HelloWorldManageHome.JNDI_NAME)为null;
    4. 怪事来了,再刷新下页面,户端能够正常返回“HelloWorld”;
      

  7.   

    package demo.ejb;/**
     * 
     * <!-- begin-user-doc --> A generated session bean <!-- end-user-doc --> * <!--
     * begin-xdoclet-definition -->
     * 
     * @ejb.bean name="HelloWorldManage" description="A session bean named
     *           HelloWorldManage" display-name="HelloWorldManage"
     *           jndi-name="HelloWorldManage" type="Stateless"
     *           transaction-type="Container"
     * 
     * <!-- end-xdoclet-definition -->
     * @generated
     */
    public abstract class HelloWorldBean
        implements javax.ejb.SessionBean
    {
      /**
       * 
       * <!-- begin-xdoclet-definition -->
       * 
       * @ejb.interface-method view-type="remote" <!-- end-xdoclet-definition -->
       * @generated
       * 
       * //TODO: Must provide implementation for bean method stub
       */
      public String getHelloWorld(String sMessage)
      {
        return "Hello World! " + sMessage;
      }
    }
      

  8.   

    package demo.test;
    import java.util.Hashtable;import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;import demo.ejb.HelloWorldManage;
    import demo.ejb.HelloWorldManageHome;
    public class HelloWorldClient
    {
      private HelloWorldManageHome getHelloWorldHome()
          throws NamingException
      {
        getContext().lookup(HelloWorldManageHome.JNDI_NAME);
        return (HelloWorldManageHome) getContext().lookup(HelloWorldManageHome.JNDI_NAME);
      }/*
      private HelloWorldManageHome getHelloWorldHome()
          throws NamingException
      {
        return (HelloWorldManageHome) getContext().lookup(HelloWorldManageHome.JNDI_NAME);
      }
    */  private InitialContext getContext()
          throws NamingException
      {
        System.out.println("###InitialContext###");
        Hashtable props = new Hashtable();
        // props.put(Context.URL_PKG_PREFIXES, "jboss.naming:org.jnp.interfaces");
        props.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
        props.put(InitialContext.PROVIDER_URL, "jnp://192.168.2.90:1099");
        InitialContext initialContext = new InitialContext(props);
        System.out.println("###initialContext###:" + initialContext);
        return initialContext;
      }
      public String getEJBString()
          throws Exception
      {
        System.out.println("------------------------------------------------------------------");
        HelloWorldManage myBean = null;
        try
        {
          myBean = getHelloWorldHome().create();
          System.out.println("###HelloWorldManage:" + myBean);
          return myBean.getHelloWorld("From Tomcat Jsp");
        }
        catch (Exception e)
        {
          System.out.println("###getEJBString Exception###" + myBean);
          throw e;
        }
      }
    }
      

  9.   

    人家在这篇文章中提到 Spring 中用缓存。这里面我发现它提到当我们的 RMI 服务器(你的例子中就是 JBOSS)有多个监听地址时可能有问题,但连接失败后重试可能又成功了。你在 JBOSS 日志里看是不是 RMI 有多个地址在监听啊?
    你试一试人家用 java.rmi.server.hostname 参数行不行啊。
    不过我也不是很明白什么原因,因为没有 EJB/RMI 的源码看的话是只能猜测啦。http://sunjun041640.blog.163.com/blog/static/256268322008112253014969/
      

  10.   

    JBoss 启动时要带 -b IP地址