The HTML protocol adaptor provides a view of the agent and its registered MBeans through a basic interface on any web browser. It is the easiest way to access an agent since no further coding is necessary. For this reason, it can be useful for testing and debugging your MBeans.
In this chapter, we will use your browser to “manage” the base agent and its MBeans. The HTML protocol adaptor outputs HTML pages that represent the agent and its MBeans. The adaptor also interprets the commands sent back by the buttons and fields appearing in your browser. It then interacts with the agent's MBean server to get information about the MBeans that it has registered and to operate on them.
This chapter relies on the base agent that you will need to start first, as explained in Chapter 5, Base Agent. Once you can connect to the HTML protocol adaptor in the base agent, you are ready to begin these topics:
6.1 Agent View is the main page for managing an agent through the HTML protocol adaptor.
6.2 MBean View exposes an MBean's management interface.
The 6.3 Agent Administration enables you to instantiate new MBeans, modify attributes and invoke operations, and select the MBeans displayed in the agent view.
The first page displayed by the HTML adaptor is always the agent view. It initially contains a list of all registered MBeans. The following figure shows the agent view for the base agent. It contains four MBeans: three communication MBeans, one of which is the HTML adaptor, and the MBean server delegate. The delegate is a special MBean explained in 6.1.2 MBean Server Delegate.
The text field for filtering by object name enables you to modify the list of displayed MBeans. The filter string is initially *:*, which displays all registered MBeans. 6.3.2 Filtering MBeans describes how to use the filter. The agent's registered domain indicates the name of the default domain in this agent. The number of MBeans on this page is the count of those listed beneath the separator line.
The Admin button links to the agent administration page (see 6.3 Agent Administration).
The MBean list contains all MBeans whose object name matches the filter string. Object names can be filtered by their domain name and list of key-value pairs. In this list, MBeans are sorted and grouped by domain name. Each MBean name listed is an active link to the page of the corresponding MBean view.
After its initialization, the contents of an agent are dynamic. New MBeans can be created and registered into new or existing domains and old MBeans can be removed. These changes can also affect the functionality of the agent. New agent services can be registered (or removed) as well. We will demonstrate examples of dynamic management in 6.3.1 Instantiating and Managing MBeans.
The MBean server delegate is an MBean that is automatically instantiated and registered by the MBean server when it is created. It provides information about the version of the Java Dynamic Management Kit (Java DMK) that is running, and it represents the MBean server when sending notifications.
Notifications are events sent by MBeans. They are covered in detail in Chapter 8, Notification Mechanism. Because the MBean server instance is not an MBean object, it relies on its delegate MBean to send notifications. The MBean server delegate sends notifications to inform interested listeners about such events as MBean registrations and unregistrations.
The exposed attributes of the delegate MBean provide vendor and version information about the MBean server. This can let a remote management application know which agent version is running and which version of the Java runtime environment it is using. The delegate MBean also provides a unique identification string for its MBean server.
Click the name of the delegate MBean to see its attributes.
Version, vendor and identification information is listed in the table of attributes.
Click the Back to Agent View link or use your browser's “Previous page” function to return to the MBean list in the agent view.
The MBean view has two functions: it presents the management interface of the MBean and it enables you to interact with its instance. The management interface of an MBean is given through the name of the attributes, the operation signatures, and a self-description. You can interact with the MBean by reloading its attribute values, setting new values, or invoking an operation.
Display the agent view.
This is the first page displayed by the HTML adaptor.
In the agent view, click on the object name of the HTML adaptor MBean: name=HTMLAdaptorServer in the default domain.
This will display its MBean view.
As shown in Figure 6–2, the top part of the page contains the description of the MBean and some controls for managing it.
The first two lines give the object instance (object name and class name) for this MBean. The MBean name is the full object name of this MBean instance, including the domain. The key-property pairs might or might not identify the MBean to a human reader, depending on the agent developer's intention. The MBean Java class is the full class name for the Java object of which this MBean is an instance.
The reload controls include a text field for entering a reload period and a manual Reload button. Initially, the reload period is set to zero indicating that the contents of the MBean view are not automatically refreshed. Clicking the Reload button forces the page to reload, thereby updating all of the attribute values displayed. If you have entered a reload period, clicking the button will begin automatic reloading with the given period. The reload period must be at least five seconds.
Use the Reload button of the MBean view instead of the browser's reload page button. After some operations, such as applying changes to attribute values, the browser's button will repost the form data, inadvertently performing the same operation again. To avoid undesirable side effects, always use the Reload button provided in the MBean view.
Type a reload period of 5 and click the Reload button.
Every five seconds the page will blink as it reloads.
In another browser window, open another connection to the HTML adaptor at http://localhost:8082/.
Observe the new values for the ActiveClientCount and LastConnectedClient attributes in the original window.
You might have to try several connections before you see the attribute values change.
The reload period is reset to zero every time you open an MBean view.
The Unregister button is a shortcut for removing this MBean from the agent. Unregistering is covered in 6.3.1 Instantiating and Managing MBeans.
The MBean description text provides some information about the MBean. Because standard MBeans are statically defined, they cannot describe themselves and the MBean server provides a generic text. Dynamic MBeans are required to provide their own description string at runtime according to the JMX specification. Except for the class name, this is the only way to tell standard and dynamic MBeans apart in the MBean view.
The second part of the MBean view is a table containing all attributes exposed by the MBean. For each attribute, this table lists its name, its Java type, its read-write access, and a string representation of its current value.
While MBean attributes can be of any type, not all types can be displayed in the MBean view. The HTML adaptor is limited to basic data types that can be displayed and entered as strings. Read-only attributes whose type supports the toString method are also displayed. Enumerated types that are concrete subclasses of com.sun.jdmk.Enumerated are displayed as a menu with a pop-up selection list. Boolean attributes are represented as true-false radio buttons. Finally, attributes with array types are represented by a link to a page that displays the array values in a table. If the attribute is writable, you can enter values for the array elements to set them.
For the complete list of supported types, see the Javadoc API of the HtmlAdaptorServer class. If an attribute type is not supported, this is indicated in place of its value. If there was an error when reading an attribute's value, the table shows the name of the exception that was raised and the message it contains.
The name of each attribute is a link that displays a window containing the description for this attribute. Like the MBean description, attribute descriptions can only be provided by dynamic MBeans. The MBean server inserts a generic description for standard MBean attributes. Figure 6–3 shows the attributes of the HTML adaptor with a description of the Active attribute.
Click on an attribute name in the table of attributes to read its description.
Because the HTML adaptor is implemented as a dynamic MBean, its attribute descriptions are meaningful.
Writable attributes have a text field for entering new values. To set the value of a writable attribute, type or replace its current value in the text field and click the Apply button at the bottom of the attributes table.
Do not try to modify the attributes of the HTML protocol adaptor here. See 6.3.1 Instantiating and Managing MBeans.
Because there is only one Apply button for all the attributes, this systematically invokes the setter for all writable attributes, whether or not their fields have actually been modified. This might affect the MBean if setters have side effects, such as counting the number of modifications, as in the SimpleStandard and SimpleDynamic examples given in Part I
The HTML adaptor detects attributes of the ObjectName type and provides a link to the view of the corresponding MBean. This link is labeled view and is located just under the displayed value of the object name. Because MBeans often need to reference other MBeans, this provides a quick way of navigating through MBean hierarchies.
The last part of the MBean view contains all the operations exposed by the MBean. Each operation in the list is presented like a method signature. There is a return type, then a button with the operation name, and if applicable, a list of parameters, each with their type as well.
As with the table of attributes, the list of operations contains only those involving types that can be represented as strings. The return type must support the toString method and the type of each parameter must be one of basic data types supported by the HTML adaptor. For the complete list, see the Javadoc API of the HtmlAdaptorServer class.
Above each operation name is a link to its description. Parameter names are also active links that display a window with a description. Again, descriptions are only meaningful when provided by dynamic MBeans. The following figure shows some of the operations exposed by the HTML adaptor MBean and a description of the Start operation.
We will not perform any operations on this MBean until after a brief explanation in 6.3.1 Instantiating and Managing MBeans.
To perform an operation, fill in any and all parameter values in the corresponding text fields and click the operation's button. The HTML adaptor displays a page with the result of the operation, either the return value if successful or the reason why the operation was unsuccessful.
The agent administration page contains a form for entering MBean information when creating or unregistering MBeans. You can also instantiate an MBean through one of its public constructors. In order to instantiate an MBean, its class must be available in the agent application's classpath. Optionally, you can specify a different class loader if the agent contains other class loader MBeans.
Go back to the agent view by clicking the link near the top of the MBean view page.
Click on the Admin button in the agent view to display the agent administration page in your browser window.
The first two fields, Domain and Keys are mandatory for all administrative actions. The Domain field initially contains the string representing the agent's default domain. Together, these two fields define the object name, whether for a new MBean to be created or for an existing MBean to unregister. The Java class is the full class name of the object to be instantiated as a new MBean. This field is ignored when unregistering an MBean.
Using the pull-down menu, you can choose one of three actions:
Create – Instantiates the given Java class of an MBean and registers the new instance in the MBean server. If successful, the MBean appears in the agent view. The class must have a public constructor without parameters in order to be created in this way.
Unregister – Unregisters an MBean from the MBean server so that it is no longer available in the agent. The class instance is not deleted explicitly, though if no other references to it exist, it will be collected by the garbage collector.
Constructors – Displays the list of public constructors at the bottom of the administration page for the given Java class. This lets you provide parameters to a specific constructor and create the MBean in this manner. This is the only way to create MBeans that do not have a constructor without parameters.
When you click the Send Request button, the HTML adaptor processes the action and updates the bottom of the page with the action results. You might have to scroll down to see the result. The text fields are not cleared after a request, enabling you to perform multiple operations. Clicking the Reset button returns the fields to their last posted value after you have modified them.
Sometimes, starting an MBean requires several steps, especially for agent services that require some sort of configuration. For example, you can instantiate another HTML adaptor for connecting to a different port. Usually, this is done programmatically in the agent application, but we must do it through the browser for the agent.
On the agent administration page, fill in the fields as follows:
In versions of the Java DMK prior to version 4.0, specifying the port number in the object name would initialize communication MBeans. Now, the names and contents of key properties no longer have any significance for any components of the product. We must set the port in other ways.
Make sure the action selected is Create and send the request. If you scroll down the page, you will see whether your request was successful.
We cannot connect to this HTML adaptor quite yet. First we need to configure it .
Go to the new HTML adaptor's MBean view with the provided link.
Remember that we could not modify any of the adaptor's attributes in To View an Attribute Description because the implementation does not allow them to be modified while the HTML adaptor is online. Our new HTML adaptor is instantiated in the stopped state (the StateString attribute indicates OFFLINE), so we can change its attributes.
Set the Port attribute to 8088 and MaxActiveClientCount to 2, then click the Apply button.
If the page is reloaded and the new values are displayed, the attribute write operation was successful. You can also click the attribute names to get a description them.
Scroll down the MBean view to the Start operation and click the Start button.
A new page is displayed to tell us the operation was successful. If you go back to the MBean view with the provided link, you can see that the StateString is now indicating ONLINE.
Now you can access your agent through a browser on port 8088. Try going to a different host on the same network and connecting to the following URL:
In the above URL, agentHostName is the name or IP address of the host where you launched the BaseAgent. If you reload the MBean view of the new HTML adaptor on either browser, the name of this other host should be the new value of the LastConnectedClient attribute.
Through this new connection, you can stop, modify or remove the HTML adaptor MBean using port 8082. In that case, your original browser will also have to use http://localhost:8088/ to connect. Instead, we will manage the agent from the second host.
From the browser on the second host, go to the agent administration page. Fill in the fields as follows and request the constructors:
The list of constructors for the SimpleStandard class is displayed at the bottom of the page. The MBean name is also shown. This is the object name that will be assigned to the MBean when using one of the listed constructors. As you can see, the SimpleStandard class only has one constructor that takes no parameters.
Click on the Create button. The result is appended to the bottom of the page. Scroll down and go to the MBean view with the provided link.
Because it is a standard MBean, all of its description strings are generic. This shows the necessity of programming meaningful attribute names.
In the agent view on the first browser window, click in the filter field and press Return to refresh the agent view.
Click the new MBean's name and set its reload period to 15.
On the second host, type in a different string for the State attribute and click Apply.
On the first host, you should see the MBean's attributes are updated when the MBean view is periodically reloaded.
On the second host, click the Reset operation button at the bottom of the MBean view page.
The operation result page is displayed and indicates the success of the operation.
This page also provides the return value of the operation when it is not void. If you go back to the MBean view, you will see the result of the operation on the attributes. You should also see it on the first host after it reloads.
The browser on the second host is no longer needed and we can remove the HTML adaptor on port 8088.
Go to the administration page and fill in the object name of the HTML adaptor you want to remove (you do not need its Java class to unregister it):
Choose Unregister from the pull-down menu and click the Send Request button.
The result is displayed at the bottom of the page.
You can also unregister an MBean directly from its MBean view. Click the Unregister button on the upper right side of the page.
Because an agent can manage hundreds of MBeans, the agent view provides a filtering mechanism for the list that is displayed. An object name with wildcard characters is used as the filter, and only those MBeans that match are counted and displayed.
Filters restrict the set of MBeans listed in the agent view. This might not be particularly useful for our small agent, but it can help you find MBeans among hundreds in a complex agent. In addition, management applications use the same filter syntax when requesting an agent's MBeans through the programmatic interface of a connector. The filtering enables managers to either get lists of MBean names or find a particular MBean instance.
Filters are typed as partial object names with wildcard characters or as a full object name for which to search, using the syntax domain:key. Here are the basic substitution rules for filtering.
Replaces any number (including zero) of characters
Replaces any one character
An empty domain name is replaced by the default domain string; an empty key list is illegal
Keys are atomic; you must search for the full property=value key; you cannot search for a partial property name or an incomplete value
An asterisk (*) can be used to terminate the key list, where it replaces any number of any keys (complete property-value pairs)
You must match all keys exactly; use the form property=value,* to search for one key in names with multiple keys
Keys are unordered when filtering; giving one or more keys (and an asterisk) in any order finds all object names that contain that subset of keys
Go to the administration page and create three more standard MBeans. Modify only the number value in their object names so that they are numbered sequentially.
In the same way as Step 1, create four dynamic MBeans starting with:
Go back to the agent view, that should display all the new MBeans.
Type each of the filter strings given in Table 6–1 to see the resulting MBean listTable 6–1 Examples of Filter Strings
Filter String (domain:key)
Gives all of the standard MBeans we created
Gives all of the standard and dynamic MBeans we created
Not allowed by rule 2
Lists all MBeans in the default domain
Not allowed by rule 3
Allowed, but list is empty (rule 5)
Not allowed by rule 3
Gives the second standard and dynamic MBean we created
Gives the one MBean matching the domain and both (unordered) keys
Allowed: special case equivalent to *:*
Notice how the MBean count is updated with each filter. This count shows the number of MBeans that were found with the current filter, which is the number of MBeans appearing on the page. It is not the total number of MBeans in the agent, unless the filter is *:*.
When you are ready to stop the base agent example, go to the window where you started its class and press Control-C.