用lookup();
EJB的分布式只要你用一句简单的LOOUP就可以搞定了。
lookup()里面要不要跟IP地址我就忘了,可以去查一下,反正用它没错了。

解决方案 »

  1.   

    有楼上说的那么简单吗???
    你最好还是找本ejb的书看看。
      

  2.   

    jboss做容器的是这样的
    java.util.Hashtable JNDIParm = new java.util.Hashtable();
        JNDIParm.put(Context.PROVIDER_URL, "210.30.67.44:1099");
    //210.30.67.44是我的ip,jboss的jndi服务端口是1099,服务器不同这个连接串也不同
        JNDIParm.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
        Context context =  new InitialContext(JNDIParm);
        Object ref = context.lookup("jndiname")
        ejbnameHome home = (FibonacciHome)PortableRemoteObject.narrow(ref,ejbnameHome.class);
      

  3.   

    我提两点:
    1、两个ejb程序不在同一个jvm中运行,他们之间要进行通讯,必须有协议,比如:iiop、rmi、或者其他??
    1楼说的用lookup();那么它到哪里去lookup()????
    我知道在j2ee sdk1.3环境下不通jvm间程序互相通讯大致如下(同楼上的在jboss下):try{
        Properties h = new Properties();
        h.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.cosnaming.CNCtxFactory");
        h.put(javax.naming.Context.PROVIDER_URL,"iiop://192.168.168.25:1050");
        //iiop://XXX.XXX.XXX.XXX就是你的jndi服务器
        InitialContext initContext = new InitialContext(h);
        QueueConnectionFactory factory = (QueueConnectionFactory)initContext.lookup("factoryName");
        Queue queue = (Queue)initContext.lookup("queueName");
        initContext.close();
    }catch(Excepiton _e){
        _e.printStackTrace();
    }但是,在提供iiop命名服务的机器上,它的命名服务怎么配置??有没有权限、授权等??它能接受那些访问者??好像我在两台机器上试了n次,都失败了。2、java的安全控制十分严格,假如两台机器间已经可以访问,有些商业方法针对不同来访者,他们是怎么处理的??
      

  4.   

    给你一个现成的例子拿去参考着写吧:
    try 
            {
             java.util.Properties h = new java.util.Properties();
         h.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,"jrun.naming.JRunContextFactory");
         h.put(javax.naming.Context.PROVIDER_URL, "218.97.169.55:2908");
    javax.naming.InitialContext ctx = new javax.naming.InitialContext(h);
                  Object o = ctx.lookup("Simple");
             ......    
            } catch (Exception e) {
               System.out.println(e.toString());
            }    注意两点就行了:
    1,需要把你请求的远程EJB的包设置到你所在机器的环境变量里面。
    2,“jrun.naming.JRunContextFactory”根据你请求的J2EE服务器不同而不同;"218.97.169.55:2908“是你请求的J2EE服务器的IP地址和命名空间端口号。
    配置好这两点后,其他的你什么都不用管了,就象使用本机器EJB那样LOOKUP()就行了。
      

  5.   

    但是,我按照 tianboguang说的做,出现下面错误;javax.naming.NameNotFoundException.  Root exception is org.omg.CosNaming.NamingC
    ontextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0
            at org.omg.CosNaming.NamingContextPackage.NotFoundHelper.read(NotFoundHe
    lper.java:72)
            at org.omg.CosNaming._NamingContextExtStub.resolve(_NamingContextExtStub
    .java:406)
            at com.sun.jndi.cosnaming.CNCtx.callResolve(CNCtx.java:440)
            at com.sun.jndi.cosnaming.CNCtx.lookup(CNCtx.java:492)
            at com.sun.jndi.cosnaming.CNCtx.lookup(CNCtx.java:470)
            at javax.naming.InitialContext.lookup(InitialContext.java:347)
            at mylib.test.jms.QSender.send(QSender.java:42)
            at mylib.test.jms.QSender.main(QSender.java:24)
    代码如下:
          //查询JNDI
          Properties h = new Properties();
          h.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.cosnaming.CNCtxFactory");
          h.put(javax.naming.Context.PROVIDER_URL,"iiop://192.168.168.25:1050");
          InitialContext initContext = new InitialContext(h);
          System.out.println("-------------");
          QueueConnectionFactory factory = (QueueConnectionFactory)initContext.lookup(factoryName);
          System.out.println(".........................");
          Queue queue = (Queue)initContext.lookup(queueName);
          System.out.println(factory + "..." +queue);
          initContext.close();      //创建jms
          QueueConnection connection = factory.createQueueConnection();
          QueueSession session = connection.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);
          QueueSender sender = session.createSender(queue);
      

  6.   

    把那个IIOP去掉呀,RMI-IIOP是用来做非JAVA客户端的通信的(以前解决这个是用CORBA)。
    再检查一下了,按上面做是肯定没错的。
    如果你还有什么要权限密码等安全限制的话,就写在那个Properties里就可以了。EJB的分布式处理是非常简单的,它的设计就是为了让你能把精力从这些服务端底层编程中解放出来,让你能专心于业务逻辑的实现。
      

  7.   

    还有,你不是在JBOSS下吗,怎么不用“org.jnp.interfaces.NamingContextFactory”;而用“com.sun.jndi.cosnaming.CNCtxFactory”
      

  8.   

    不是的,我在sun自带的 j2ee sdk1.3环境下做的,
    好像去掉了iiop就不行了,j2ee sdk1.3在1050端口开取了iiop服务我的错误我找到了,是没找到该命名,现在该过来了,谢谢你的帮助,分,加上!