HA-JNDI server side problem
wecucho May 20, 2008 5:01 PMHi all, first at all i am running JBoss 4.2.2 GA.
I develop a few methods to obtain the master node for a cluster easily given at least a node and all works great outside the server (the reason i need the master node is to create and delete JMS queues).
In my test enviroment i have a cluster with 2 nodes, A and B, and i have a web application deployed on both nodes who has the fancy buttons to see, create and remove my queues... so, i ported my tests code into the web component and fails obtaining the master node, i already read the documentation and i am doing exactly what they say without a positive result, my InitialContext always return the local instance for the node who runs the web component, so, if i start the web page in the master node all runs ok, by the other hand if i use the web pages in the Non Master node it will fail.
My Nodes are:
A = 192.168.5.63 (MASTER)
B = 192.168.5.52 (Non Master)
The magic button who try to obtain the correct Master Node has the following code (just as the documentation says):
public static MBeanServerConnection getMasterNodeFromCluster(int tries, String node) {
try {
for (int i = 0; i < tries; i++) {
Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
env.put(Context.URL_PKG_PREFIXES, "jboss.naming:org.jnp.interfaces");
env.put(Context.PROVIDER_URL, node);
System.out.print("trying with " + node);
Context ctx = new InitialContext(env);
MBeanServerConnection mbs = (MBeanServerConnection) ctx.lookup("jmx/invoker/RMIAdaptor");
System.out.print(" obtained "
+ mbs.getAttribute(new ObjectName("jboss:service=HAJNDI"), "BindAddress").toString());
if (mbs.getAttribute(new ObjectName("jboss.ha:service=HASingletonDeployer"), "MasterNode").toString()
.equalsIgnoreCase("true")) {
System.out.println();
return mbs;
}
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("not found");
return null;
}
and i am calling this method from the action of the button this way:
JMQueuesUtils.getMasterNodeFromCluster(10, "192.168.5.63:1100");
Don't pay any attention to the 'tries' variable, that was just a test...
The Cluster Guide for JBoss 4.2 says literally this:
So, an EJB home lookup through HA-JNDI, will always be delegated to the local
JNDI instance. If different beans (even of the same type, but participating in different
clusters) use the same JNDI name, it means that each JNDI server will have a
different "target" bound (JNDI on node 1 will have a binding for bean A and JNDI
on node 2 will have a binding, under the same name, for bean B). Consequently, if
a client performs a HA-JNDI query for this name, the query will be invoked on any
JNDI server of the cluster and will return the locally bound stub. Nevertheless, it may
not be the correct stub that the client is expecting to receive!
and ....
If you want to access HA-JNDI from inside the application server, you must explicitly
get an InitialContext by passing in JNDI properties. The following code shows how to
create a naming Context bound to HA-JNDI:
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
p.put(Context.URL_PKG_PREFIXES,
"jboss.naming:org.jnp.interfaces");
p.put(Context.PROVIDER_URL, "localhost:1100"); // HA-JNDI port.
return new InitialContext(p);
im doing exactly this but simply does not work... :(
Thanks in advance! and forgive my english.