我有一个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”就在那里。
有什么意见吗?
答案 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启动客户端。这意味着将客户端代码作为应用程序客户端打包到耳中,并使用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");