首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JBoss聚类和Lighttpd负载平衡显示不一致行为

JBoss聚类和Lighttpd负载平衡显示不一致行为
EN

Stack Overflow用户
提问于 2013-05-17 10:44:55
回答 1查看 797关注 0票数 4

问题

我们在不同的机器上安装了两个JBossAS 4.2.3,它们是集群的。我们还使用了用作负载均衡器的Lighttpd,它位于Tomcat服务器( Tomcat服务器不集群)和JBoss服务器之间。一旦所有服务器都启动并运行,应用程序将完美无缺地运行。如果我取下一台JBoss服务器,请求就会像预期的那样重定向到另一台服务器。退出应用程序后,我的问题就开始了。在尝试重新登录应用程序时,我得到一个异常,即Tomcat无法连接到被关闭的服务器。

服务器设置

  1. Machine01 - Tomcat7
  2. Machine02 - Tomcat7
  3. Machine03 - JBoss 4.2.3
  4. Machine04 - JBoss 4.2.3
  5. Machine05 - Lighttpd 1.4.28

其他信息

  • 所有机器都使用Ubuntu12.04操作系统。
  • JBoss机器是群集的。
  • EAR被放置在all/deploy文件夹中。
  • JBossAS是使用以下命令- ./run.sh -b 0.0.0.0 -c all --partition=SomePartitionName &> /dev/null &启动的。
  • Tomcat7作为服务运行,因此它们作为sudo service tomcat7 start启动。
  • Lighttpd被配置为作为JBoss机器的负载均衡器。
  • lighttpd上的以下mod_proxy配置: server.modules += ( "mod_proxy“) proxy.balance =”proxy.server =“(”=>“(”主机“=> "Machine03",”端口“=> 1100 ),(”主机“=> "Machine04",”端口“=> 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

无法理解为什么,在我从应用程序中取出一台机器并注销之后,Tomcat就不再有对JBoss机器的代理引用了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-29 16:46:33

我已经把它解决了。感谢smallworld为我指明了正确的方向。正在发生的事情是,我们缓存从jndi查找获得的远程接口。现在,据我所知,这个远程接口只指向集群中的一个特定服务器。(我们认为远程接口足够智能,可以识别服务器已经故障。看起来,当您进行查找时,这种智能就在具有初始上下文的某个地方)。因此,一旦服务器被关闭,任何对远程接口进行的ejb调用都会连接到被关闭的服务器。因此,为了解决这个问题,我们停止了缓存远程接口,并在每次需要该EJB的服务时进行查找。如果任何服务器关闭,则查找将返回正在启动和运行的服务器的远程接口。有了这个,集群运行得完美无缺!所以,伙计们,你们的代码应该是这样的:

代码语言:javascript
复制
    // 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;
}

评论行是引起问题的原因。现在我唯一需要研究的是,如果有更好的解决方案的话。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16607113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档