2016-01-28 47 views
8

Próbuję wywołać zdalny interfejs ejb na każdym węźle klastra z węzłem węzeł1 & węzeł2, ale zawsze otrzymuję węzeł1. Wdrożony kod klienta EJB & jako plik EAR w obu węzłach. Aplikacja działa na serwerze aplikacji Wildfly 9 ApplicationServer. Wywoływany kod klienta z węzła1.Wywoływanie zdalnego interfejsu ejb w klastrze z dwoma węzłami klastra:

kod 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); 
     } 
    } 
} 

kod klienta:

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); 
      } 
     } 
    } 
} 

w dziennikach,

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

Proszę zaproponować

+0

Prawdopodobnie klastra ma tylko jedną usługę JNDI. –

+0

Gabriel, nie rozumiem. Jak mogę się upewnić, że każdy węzeł w klastrze ma oddzielną usługę JNDI? – Hello

+0

możesz sprawdzić węzły listy i upewnić się, że są różne w czasie tworzenia, zanim wykonasz testBean (lista ). –

Odpowiedz

2

Aby korzystać klastrowego EJB dziką muchę musi być skonfigurowane dla klastrów i ile znalazłem:

  1. JBoss Application Server zapewnia grupowania stanowych EJB.
  2. Dokumentacja typu "dzikie muchy" dostarcza przykładu scenariusza przełączania awaryjnego dla klastrowania. (Klient próbuje skontaktować się z ejb na serwerze nr 1, jeśli jest niedostępny, klient kontaktuje się z serwerem ejb na serwerze nr 2).
  3. Erupy klastrowe muszą być odpowiednio skonfigurowane i opatrzone odpowiednią adnotacją.
import org.jboss.ejb3.annotation.Clustered; 
import javax.ejb.Stateful; 

@Stateful 
@Clustered 
public class MyStatefulBean { 
... 
} 

Przykłady są podane na tej stronie dokumentacji, który opisuje to, co musi być zrobione w szczegółach. https://docs.jboss.org/author/display/WFLY8/EJB+Services

Jeśli zastosujesz tę konfigurację, EJB ze wszystkich węzłów klastra może obsługiwać klienta.

Należy jednak pamiętać, że klient powinien być całkowicie nieświadomy istnienia klastrów. Klienci muszą wywołać funkcję ejb, a decyzja o tym, która instancja służy klientowi, powinna należeć do klastra.

+1

Może to wprowadzać w błąd ludzi: "Klastrowanie EJB jest zapewnione tylko dla statefull ejbs.". Klaster ** działa ** w systemie Wildfly w przypadku EJB bezstanowych zapewniających przełączanie awaryjne i równoważenie obciążenia. – Dherik

+1

Zaktualizowałem tekst. Masz rację, poprawiłem sformułowanie dzięki twojej obserwacji. –