Once the proxies are generated and available in your application's classpath, their usage is straightforward. For each of the proxy objects it wants to use, the application needs to instantiate its proxy class and then bind it to a ProxyHandler object. The application is responsible for creating and binding all of the proxies that it wants to use, and it must unbind and free them when they are no longer needed.
In previous versions of the Java DMK, the connector client handled the creation of proxy instances and ensured that only one proxy object could exist for each MBean. Since version 4.2 of the product, connector clients no longer instantiate nor control proxy objects. The corresponding methods of the RemoteMBeanServer interface are now deprecated.
Similarly, the previous binding methods in the Proxy interface are deprecated in favor of the new setServer and getServer methods. This change is necessary so that proxies can be bound to any ProxyHandler object, to enable for both local and remote proxies.
All parameters for binding the proxy can be given in its constructor, which makes it very simple to instantiate and bind a proxy in one step.
String mbeanName = "SimpleStandard"; // build the MBean ObjectName instance ObjectName mbeanObjectName = null; String domain = connectorClient.getDefaultDomain(); mbeanObjectName = new ObjectName( domain + ":type=" + mbeanName ); // create the MBean in the MBeanServer of the agent String mbeanClassName = mbeanName; ObjectInstance mbeanObjectInstance = connectorClient.createMBean( mbeanClassName, mbeanObjectName ); // create and bind a proxy MBean on the client side // that corresponds to the MBean just created in the agent Proxy mbeanProxy = new SimpleStandardProxy( mbeanObjectInstance, connectorClient ); echo("\tPROXY CLASS NAME = " + mbeanProxy.getClass().getName() ); echo("\tMBEAN OBJECT NAME = " + mbeanProxy.getMBeanObjectInstance().getObjectName() ); echo("\tCONNECTOR CLIENT = " + mbeanProxy.getServer().getClass().getName() ); |
If the class name of your proxy is not known at compile time, you will have to instantiate its class dynamically. In the following code, we obtain the proxy class name that corresponds to an MBean, and we call its first constructor. This must be the constructor that takes an ObjectInstance identifying the MBean, and we must dynamically build the call to this constructor. We then call the setServer method to bind the new proxy instance.
// Get the class name of the MBean's proxy Class proxyClass = Class.forName( connectorClient.getClassForProxyMBean( mbeanObjectInstance )); // Find the constructor with takes an ObjectInstance parameter Class[] signature = new Class[1]; signature[0] = Class.forName("javax.management.ObjectInstance"); Constructor proxyConstr = proxyClass.getConstructor( signature ); // Call the constructor to instantiate the proxy object Object[] initargs = new Object[1]; initargs[0] = mbeanObjectInstance; Proxy proxy2 = (Proxy) proxyConstr.newInstance( initargs ); // Bind the proxy proxy2.setServer( connectorClient ); echo("\tPROXY CLASS NAME = " + proxy2.getClass().getName()); echo("\tMBEAN OBJECT NAME = " + proxy2.getMBeanObjectInstance().getObjectName()); echo("\tCONNECTOR CLIENT = " + proxy2.getServer().getClass().getName()); // We no longer need proxy2, so we unbind it proxy2.setServer( null ); |
Once a proxy is bound, you can access the attributes and operations of its MBean through direct calls to the proxy object, as shown in the following example.
try { // cast mbeanProxy to SimpleStandardProxy, so we can // call its MBean specific methods SimpleStandardProxy simpleStandardProxy = (SimpleStandardProxy) mbeanProxy; [...] // Change the "State" attribute simpleStandardProxy.setState("new state from client"); // Get and display the new attribute values echo("\tState = \"" + simpleStandardProxy.getState() + "\""); echo("\tNbChanges = " + simpleStandardProxy.getNbChanges()); // Invoke the "reset" operation simpleStandardProxy.reset(); [...] // We are done with the MBean, so we // unbind the proxy and unregister the MBean simpleStandardProxy.setServer( null ); connectorClient.unregisterMBean( mbeanObjectName ); } catch (Exception e) { echo("\t!!! Error accessing proxy for " + mbeanProxy.getMBeanObjectInstance().getObjectName() ); e.printStackTrace(); } |