在双节点wildfly集群中调用远程ejb

时间:2016-01-28 18:34:37

标签: java java-ee remote-access ejb-3.1 wildfly-9

我试图在节点node1&节点的每个节点上调用远程ejb。 node2,但我总是得到node1。部署的EJB&客户端代码作为两个节点中的EAR文件。应用程序在Wildfly 9 ApplicationServer上运行。从node1调用客户端代码。

EJB代码

@Remote
public interface SLSBRemote {
    public void test();
}

@Stateless(mappedName="SLSBEJB")
public class SLSBEJB implements SLSBRemote {
    @Override
    public void test() 
    {
       try {
          String nodeName = System.getProperty("jboss.node.name");
          if(nodeName == null) {
             nodeName = InetAddress.getLocalHost().getHostName();
          }
          log.debug("nodename: "+nodeName);
       } catch (Exception e) {
          log.error("Error",e);
       }
    }
}

客户代码:

public class testEjb
{
    //invoking this method from other class. Able to pass node address
    public void testBean(List<String> nodes)
    {
       Properties properties = new Properties();
       properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
       Context context;
       for (String node : nodes) {
           properties.put(Context.PROVIDER_URL,"http-remoting://" + node);
           try {
             context = new InitialContext(properties);                  
             SLSBRemote slsbRemote=(SLSBRemote)context.lookup(getLookupName());
             log.debug("node:"+node+"slsbejbobject:"+slsbRemote.hashCode());
             slsbRemote.test();
           } catch (NamingException e) {
             log.error("Error ", e);
           }
       }
   }
}

在日志中,

node: "node1", binddbejb object: 1276422461
node: "node2", binddbejb object: 1276422461
nodename: "node1_address"
nodename: "node1_address" (instead of node2_address)

请建议

1 个答案:

答案 0 :(得分:2)

为了使用群集EJB,需要为群集配置Wild fly,并且据我所知:

  1. Wildfly提供有状态EJB的集群。
  2. Wild fly文档提供了群集故障转移方案的示例。 (客户端尝试联系服务器#1上的ejb,如果它不可用,则客户端会联系服务器#2上的ejb。)
  3. 群集Ejbs需要根据需要进行配置并正确注释。
  4. import org.jboss.ejb3.annotation.Clustered;
    import javax.ejb.Stateful;
    
    @Stateful
    @Clustered
    public class MyStatefulBean {
    ...
    }
    

    示例从文档的这个页面给出,它描述了必须要做的详细内容。 https://docs.jboss.org/author/display/WFLY8/EJB+Services

    如果应用此配置,则群集中所有节点的EJB都可以为客户端提供服务。

    但请注意,客户端通常应完全不知道群集。客户端需要调用ejb,它应该由集群决定哪个实例为客户端服务。