I've refactored the management code to make it work on a cluster of JBM2 nodes.
Now, all management operations use core messages which are replicated on the live & backup nodes to ensure that their states are correctly replicated (e.g. creation on a queue on both nodes, etc.)
To make it simple to manage JBM, we still expose the management operations through JMX MBeans. These mbeans implementations are simple facade which creates a corresponding Core message, sent it to a well-known "management address" and wait for the reply (see top class ).
We use a INVM connector to connect to the server (since the core message is sent from *inside* the server).
To make the code more generic, JMX operation invocations *always* goes through a replicated core message wether the node is replicated or not.
This implies that the server *must* always have a INVM acceptor ready to accept the core message from the management code.
I hesitated to have a switch for every management operation implementation (if the node is not replicated, invokes directly, else use a replicated core message) but I stick to a single implementation (INVM connection code path is straightforward enough) to make the code more uniform.
For now, I have not changed the server configuration. This means that the user must explicitely add a INVM acceptor if he wants to be able to manage the server using JMX.
To make it more user-friendly, I'll add the creation of the INVM acceptor when the user configuration set jmx-enable to true.
Looks good :)