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ć
Prawdopodobnie klastra ma tylko jedną usługę JNDI. –
Gabriel, nie rozumiem. Jak mogę się upewnić, że każdy węzeł w klastrze ma oddzielną usługę JNDI? – Hello
możesz sprawdzić węzły listy i upewnić się, że są różne w czasie tworzenia, zanim wykonasz testBean (lista >). –