问题
我们在不同的机器上安装了两个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
启动。以下是lighttpd上的mod_proxy配置:
server.modules += ( "mod_proxy" )
proxy.balance = "fair"
proxy.server = ( "" => (( "host" => "Machine03", "port" => 1100 ),
( "host" => "Machine04", "port" => 1100 ))
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
无法弄清楚为什么在我关闭机器并从应用程序注销后,Tomcats再也没有对JBoss机器的代理引用。
答案 0 :(得分:0)
我现在已经解决了。感谢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;
}
评论的行是引起问题的行。现在,我唯一需要研究的是如果有的话可以更好地解决这个问题。