Now that the manager is connected to the client, we can ask it to load classes. First we have it create an m-let loader MBean that we can use to download classes. Then we demonstrate the various ways of loading classes:
Through an m-let file, which has the advantage of loading many MBeans at once
Directly, from a code-base that was used in an m-let file
Directly, after specifying a URL for the code-base
The following code is from the manager's runMLetExample method. The code is identical to the code of the agent example except that we now go through the RemoteMBeanServer interface of the connector client instead of directly through the MBean server.
// Get the domain name from the MBeanServer. String domain = connectorClient.getDefaultDomain(); // Create a new MLet MBean and add it to the MBeanServer String mletClass = "javax.management.loading.MLet"; ObjectName mletName = new ObjectName(domain + ":name=" + mletClass); connectorClient.createMBean(mletClass, mletName); [...] // Create new EquilateralTriangle MBeans through MLET tags // The url_2 string is read from the command line Object mletParams_2[] = {url_2}; String mletSignature_2[] = {"java.lang.String"}; Set mbeanSet = (Set) connectorClient.invoke( mletName, "getMBeansFromURL", mletParams_2, mletSignature_2); for (Iterator i = mbeanSet.iterator(); i.hasNext(); ) { Object element = i.next(); if (element instanceof ObjectInstance) { // Success echo("OBJECT NAME = " + ((ObjectInstance)element).getObjectName()); } else { // Failure echo("EXCEPTION = " + ((Throwable)element).getMessage()); } } |
Now that the class loader has used the code-base of the JAR file, we can create more of the MBeans from the same JAR file. We invoke the createMBean method of the server with the object name of the class loader.
// Create another EquilateralTriangle MBean from the same jar file // used in the MLET file String triangleClass = "EquilateralTriangle"; ObjectName triangleName = new ObjectName( "MLetExample:name=" + triangleClass + ",id=3"); Object triangleParams[] = {new Integer(20)}; String triangleSignature[] = {"java.lang.Integer"}; connectorClient.createMBean(triangleClass, triangleName, mletName, triangleParams, triangleSignature); |
Finally, if we have a different code-base not associated with an m-let file, we can give its URL directly to the loader. This enables us to ask the agent to create almost any MBean, imitating a class “push” mechanism.
// Add a new URL to the MLet MBean to look for classes // The url_1 string is read from the command line Object mletParams_1[] = {url_1}; String mletSignature_1[] = {"java.lang.String"}; connectorClient.invoke(mletName, "addURL", mletParams_1, mletSignature_1); // Create a new Square MBean from its class in the Square.jar file String squareClass = "Square"; ObjectName squareName = new ObjectName( "MLetExample:name=" + squareClass); Object squareParams[] = {new Integer(10)}; String squareSignature[] = {"java.lang.Integer"}; connectorClient.createMBean(squareClass, squareName, mletName, squareParams, squareSignature); |
In this way, the manager can make code available on the network, and it can direct its agents to load the classes to create new MBeans ready for management. This mechanism can be used to distribute new resources, provide new services, or update applications, all under the control of the manager.