EJB查找问题

时间:2011-08-02 11:37:46

标签: glassfish ejb

我有一个Glassfish v2.1.1群集设置。我将一个包含单个无状态bean的EAR文件部署到独立服务器。它有一个IIOP端口3752。

将与此bean通信的客户端应用程序部署在群集上。当我查找bean的名字时,我得到NameNotFoundException。代码如下所示:

Properties props = new Properties();

props.setProperty("java.naming.factory.initial",    "com.sun.enterprise.naming.SerialInitContextFactory");

props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");

props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");


if (logger.isDebugEnabled()) {

  logger.debug("Looking for bean from location : " + PropertiesService.instance().getSchedulerOrbHost() + ":"

                + PropertiesService.instance().getSchedulerOrbPort());

}


props.setProperty("org.omg.CORBA.ORBInitialHost",     PropertiesService.instance().getSchedulerOrbHost());

props.setProperty("org.omg.CORBA.ORBInitialPort",     PropertiesService.instance().getSchedulerOrbPort());


InitialContext context = null;


try {

context = new InitialContext(props);

} catch (NamingException e) {

e.printStackTrace();

}

String beanName = "test.OperationControllerRemote";

OperationControllerRemote remote = (OperationControllerRemote) context.lookup(beanName);

请注意,我检查了JNDI树,名称“test.OperationControllerRemote”就在那里。

有什么意见吗?

1 个答案:

答案 0 :(得分:0)

以下是我使用GF 2.1.1群集和Swing客户端的方法。由于客户端启动速度,我目前正在使用Standalone选项,但ACC可能适合您。

独立

你这样做的方式被认为是独立的。

http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#StandaloneRemoteEJB

http://blogs.oracle.com/dadelhardt/entry/standalone_iiop_clients_with_glassfish

ACC

另一种解决方法是使用ACC启动客户端。这意味着将客户端代码作为应用程序客户端打包到耳中,并使用JNLP方法启动或在客户端计算机上手动安装捆绑的ACC(mini glassfish)。在GF 2.1中,两种方式都可以正常工作,但两者都非常胖,JNLP方法可以使启动时间更长一些。据推测,在GF 3.1中,他们重新设计了ACC并且启动速度更快。可能不太明显的是,使用ACC,您将获得在客户端启动时自动提供的群集中的服务器列表。

http://blogs.oracle.com/theaquarium/entry/java_ee_clients_with_or

http://download.oracle.com/docs/cd/E18930_01/html/821-2418/beakv.html#scrolltoc

http://download.oracle.com/docs/cd/E18930_01/html/821-2418/gkusn.html

查找

上述任何一种方法都为客户端提供RMI / CORBA故障转移和负载均衡。

无论哪种方式,当你对类路径和com.sun.appserv.iiop.endpoints系统属性集(如node1:33700,node2:33701)有正确的依赖关系时,你只需要no-args的InitialContext,因为Glassfish的东西是autoregisters他们的连接属性等,如第一个链接中所述:

new InitialContext()

查找将起作用。对于我的远程会话bean(EJB 3.0),我通常会这样做:

@Stateless(mappedName="FooBean")
public class FooBean implements FooBeanRemote {}

@Remote
public interface FooBeanRemote {}

然后在客户端代码中:

FooBeanRemote foo = (FooBeanRemote) ctx.lookup("FooBean");