问题
我们在不同的机器上安装了两个JBossAS 4.2.3,它们是集群的。我们还使用了用作负载均衡器的Lighttpd,它位于Tomcat服务器( Tomcat服务器不集群)和JBoss服务器之间。一旦所有服务器都启动并运行,应用程序将完美无缺地运行。如果我取下一台JBoss服务器,请求就会像预期的那样重定向到另一台服务器。退出应用程序后,我的问题就开始了。在尝试重新登录应用程序时,我得到一个异常,即Tomcat无法连接到被关闭的服务器。
服务器设置
其他信息
all/deploy文件夹中。./run.sh -b 0.0.0.0 -c all --partition=SomePartitionName &> /dev/null &启动的。sudo service tomcat7 start启动。jndi.properties有以下条目
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces java.naming.provider.url=Machine05:80无法理解为什么,在我从应用程序中取出一台机器并注销之后,Tomcat就不再有对JBoss机器的代理引用了。
发布于 2013-05-29 16:46:33
我已经把它解决了。感谢smallworld为我指明了正确的方向。正在发生的事情是,我们缓存从jndi查找获得的远程接口。现在,据我所知,这个远程接口只指向集群中的一个特定服务器。(我们认为远程接口足够智能,可以识别服务器已经故障。看起来,当您进行查找时,这种智能就在具有初始上下文的某个地方)。因此,一旦服务器被关闭,任何对远程接口进行的ejb调用都会连接到被关闭的服务器。因此,为了解决这个问题,我们停止了缓存远程接口,并在每次需要该EJB的服务时进行查找。如果任何服务器关闭,则查找将返回正在启动和运行的服务器的远程接口。有了这个,集群运行得完美无缺!所以,伙计们,你们的代码应该是这样的:
// Some where at class level we have the following map declared
private static final Map remoteEJBHashMap = new HashMap(100, 0.9f);
public static final <T> T getEJBInterface(String jndiLookupName) {
String jndiName = jndiLookupMap.get(jndiLookupName);
T ejbInterface = null;
//T ejbInterface = (T) remoteEJBHashMap.get(jndiLookupName);
//if (ejbInterface == null) {
try {
ejbInterface = (T) ctx.lookup(jndiName);
} catch (NamingException e) {
throw new RuntimeException(e);
}
//remoteEJBHashMap.put(jndiLookupName, ejbInterface);
//}
return ejbInterface;
}评论行是引起问题的原因。现在我唯一需要研究的是,如果有更好的解决方案的话。
https://stackoverflow.com/questions/16607113
复制相似问题