Welcome!

Java IoT Authors: Liz McMillan, Elizabeth White, Pat Romanski, Stackify Blog, Progress Blog

Related Topics: Java IoT

Java IoT: Article

Managing J2EE Systems with JMX and JUnit

Manage new systems as they are developed

The promise of J2EE was to build more robust, scalable, and secure enterprise systems. J2EE promised that we could do it quickly and easily since J2EE is supposed to take the complexity out of building powerful distributed systems. But as with the J2EE spec itself, these systems usually suffer through management only as an afterthought.

Many management systems focus on proprietary interfaces that react to specific events. They offer solutions in which your management is tied up with the system you are managing. JMX4ODP decouples testing and management from the target system and focuses on using reusable components that are bound and deployed using XML configurations.

This article walks you through the process of setting up a basic service monitor and event handler for a common J2EE n-tier system. Developers of J2EE systems will be able to use JMX4ODP to create testing suites to help them develop more reliable systems. J2EE application administrators will be able to use JMX4ODP to simplify and regulate the management of deployed systems.

Technologies Used
JMX4ODP is built from open standards technologies because they offer a better return on their investment by leveraging the work and experience of the community. Open standards also leverage your work and experience; for example, if your project has been tested in the past, you probably have someone on staff who already has JUnit experience. If you don't, learning JUnit will be useful for future projects.

JUnit and JMX are the two core foundations for JMX4ODP's approach to management. JUnit is becoming the de facto standard for unit testing. JUnit support is common in most IDE and test suites. JMX is Java's official answer to system management. Groups like JBoss are pushing JMX even further to make it a key piece in building complex infrastructures. JMX support is common in major J2EE application servers. IBM has even integrated JMX functionality with its popular Tivoli suite.

What You Need
To implement the examples in this article, make sure you have the following libraries available:

  • JMX4ODP: The core diagnostic and event manager suite (http://jmx-4odp.sourceforge.net).
  • JUnit: The de facto standard for unit testing of Java components (www.junit.org).
  • JMX: The J2EE Java Management Extensions (www.javasoft.com/jmx).
  • JMX Remoting: The JSR to expand JMX to include remote access (http://jcp.org/en/jsr/detail?id=160).
  • Xerces: The popular Apache XML parser (http://xml.apache.org/xerces-j/index.html). Note: JMX4ODP has not been ported to use Xerces 2 yet, so you'll need Xerces 1, which ships with the current JBoss, WebLogic, and WebSphere.
  • JavaMail: The J2EE extension for e-mail (http://java.sun.com/products/javamail/).

    JUnit as a Diagnostics Tool
    JUnit bills itself as a regression-testing suite for code objects, but it's not much of a leap to see it as a tool for distributed system diagnostics. JUnit runs tests by instantiating objects, invoking their methods with known inputs, and checking the output against expected returns.

    Distributed systems are built over time as a collection of services - some standardized, some proprietary. Each service can be treated as an object for JUnit to test. In a typical J2EE installation, you have HTTP daemons, servlet engines, JNDI trees, RMI-enabled EJB containers, and databases accessed via JDBC.

    Figure 1 illustrates these services as extensions of common protocols or as classes of objects to test. Since a system has a limited number of supported protocols, you can save a lot of coding by creating a base test class for each protocol and extending it as needed. The JMX4ODP's org.jmx4odp.junit DiagnosticWorkers package contains classes for testing HTTP, RMI, and JDBC services.

     

    JUnit Test for Services
    The JMX4ODP test classes follow the JUnit "assert" pattern. Each possible test method name starts with "assert," allowing developers to easily identify testing methods versus utility methods. Each method is stateless, allowing multiple testing objects to utilize the same underlying protocol test object, e.g., the HttpClientTest object contains methods for acquiring an HttpURLConnection and testing the connection for HTTP statuses and content.

    By extending these basic service test classes to encapsulate a series of stateful tests, we get objects that are simply beans that contain a set of tests to run on a service. For example, you could extend the HTTP protocol test class to create an object that checks if you can reach a URL. You could then extend this class to make a test that checks a secured URL.

    JMX4ODP's org.jmx4odp.junitDiagnosticWorkers package contains tests for three basic services: HTTP, RMI, and JDBC. Each is implemented as a stateful bean that you instantiate, set parameters for, and then hand over to JUnit to run.

    To test HTTP services with BasicHttpUrlTest, set the URL you want to check and hand the object to JUnit, which will invoke each method that starts with the word "test." BasicHttpUrlTest's only test method is "test_URLOk," which checks the URL for a returned HTTP: 200 OK.

    BasicEjbTest tests EJB services. It can use the settings in your jndi.properties to connect to your JNDI tree, or you can set them programmatically. You must set the JNDI name of the EJB. It contains one test, "test_AccessEJB," which tries to retrieve a RemoteObject from the JNDI tree by the set name and invoke getEJBMetaData upon it.

    The BasicJDBCTest is more complicated. You need to set the JDBC URL, a test SQL select statement, and the database username and password. You can set an optional record threshold, which defaults to 1. This test object checks for two things before giving the service a green light. First, it runs "test_Can- Connect" to check if JDBC can connect to the database. Second, it runs "test_ SelectGood" to ensure that the test SQL select statement returns at least as many records as the threshold is set to.

    Building Your TestSuite
    JUnit has the ability to hierarchically arrange tests using TestSuite objects, but TestSuites are maintained programmatically, which is a big maintenance hit. JMX4ODP uses the org.jmx4odp. junitDiagnosticWorkers.SuiteAssembler object to translate an XML file into a TestSuite object, which cuts all the coding from maintenance.

    Figure 2 shows the TestSuite XML entities used by the SuiteAssembler. TestSuite objects can hold either another TestSuite or TestCase. A TestCase is one of the stateful test beans. You invoke the get/set methods for service and test properties such as URLs and thresholds with the INVOKE element, which can take arguments of java.lang.String, boolean, and int. A TestSuitexml to test Yahoo's Web servers would look like:

     
    Figure 2

    <TESTSUITE name="Web Servers" >
    <TESTCASE name="Yahoo" className=\
    "org.jmx4odp.junitDiagnosticWorkers\
    BasicHttpUrlTest" >
    <INVOKE method="setUrl" >
    <ARG type="java.lang.String"
    value="http://www.yahoo.com"
    />
    </INVOKE>
    </TESTSUITE>

    SuiteAssembler will parse the XML and generate a TestSuite called "Web Servers" that contains a single BasicHttpUrlTest test bean called "Yahoo". It then hands the TestSuite over to JUnit, which will run the BasicHttpUrlTest.test_UrlOk method to see if a connection to www.yahoo.com returns an HTTP 200:OK. If Yahoo is unreachable or returns a different status, JUnit will display a failure.

    You can use JUnit's junit.swingui .TestRunner to run JUnit tests in a graphical interface. Pass TestRunner the name of your test class as an argument. The JMX4ODP SuiteAssembler will load a TestSuite.xml file in the working directory. If you use the example TestSuite.xml and type:

    > java junit.swingui.TestRunner
    org.jmx4odp.junitDiagnosticWorkers.SuiteAssembler

    in the same directory, JUnit will parse the file, try to connect to www.yahoo.com, and display the results.

    At this point you could simply build a TestSuite.xml file to check all the services you want and just use JUnit to run on-demand diagnostics of all your systems. If the line is green, the servers are clean. This would certainly be handy at 3 a.m. when you get the "the site is acting weird" phone call.

    Already you can quickly and repeatedly run a set of known tests on your site and identify problems. However, this is a reactive instead of proactive solution. We now need to automate these tests and feed the results to a system that can use them.

    Using Tests to Manage with JMX
    Before JMX, there was no Java standard way for starting, stopping, monitoring, and managing components. If you're not familiar with JMX, there are some great books, such as JMX: Managing J2EE with Java Management Extensions by Marc Fleury, Juha Lindfors, and The JBoss Group.

    JMX is a powerful and convenient way of building loosely coupled systems. The JMX agent is a bean container for specialized management beans called MBeans. The agent allows you to instantiate new MBeans, register existing MBeans, bind MBeans together, and send and receive notifications.

    Many J2EE engines and management packages have adopted JMX as a core feature, because it's flexible and extensible. J2EE programmers are familiar with component-based programming, and JMX capitalizes on that to create component-based management systems that are scalable. JSR 160 (www.jcp.org/en/jsr/detail?id=160) is extending the core JMX specification to include remoting functionality, which is used by JMX4ODP to connect clients and other agents to each other via RMI.

    EventRunner
    org.jmx4odp.junitRunner.Event Runner is an MBean that implements a JUnit TestRunner. It serves as the bridge between your JUnit diagnostic setup and JMX management. It will fetch a Test- Suitexml from a given URL, use the SuiteAssembler to construct a TestSuite, hand it to a JUnit TestRunner to run all the tests, and broadcast any failures or errors as notifications to any registered listeners. The EventRunner will then sleep for the specified time and do it all over again.

    You can think of JMX4ODP as a reflex system for your J2EE system. JUnit test objects act as live nerves gathering information about the state of objects and services in your system. The JMX agent is like a spinal cord, transmitting these impulses between the brain and muscles. The Event- Runner MBean, the system's brain, coordinates all the JUnit tests and keeps them running regularly. Now you just need to add some muscle to complete the system.

    Muscle takes the form of JMX NotificationListener MBeans. Any MBean that implements the javax. management.NotificationListener interface can register itself with the EventRunner to receive failure and error notifications. The Notification- Listener will receive a javax. management. Notification object that contains attributes including timestamp, type, and message. The type of message can be set via the two EventRunner methods: setErrorTopic(String s) and setFailureTopic(String s). The event runner will broadcast the message as an error type if an error occurred while trying to run the test. It will use the failure topic if the test was unsuccessful. The event notification message will be formatted like TestFailure.getName() + ": " + failure.toString(); if failure.to String() returns a null, it will use failure. thrownException().toString().

    A NotificationListener can register with the EventRunner and be activated upon these events. It can use the Notification.getMessage() to learn which test failed and how. We'll use the org.jmx4odp.notificationWorkers.Notifi cationMailer as a simple starting place. This MBean uses the javax.mail.* package to e-mail JMX notifications. By registering the Notification Mailer with the EventRunner, you have a failure notification system that will alert your sysadmin when a problem occurs.

    All this needs to be set up programmatically which is a maintenance issue. JMX's MLet object can be used to make a JMX agent load MBeans specified in an XML file, but it doesn't include the ability to invoke functions on instantiated MBeans. To overcome this, JMX- 4ODP uses its org.jmx4odp. j4oNet.Xml- Executor object to load and access MBeans in an agent.

    Figure 3 shows the XML entities used by the XmlExecutor. Listing 1 shows the beginning of such a file.

     
    Figure 3

    Everything is a child of the EXECUTEXML element. The JMXREMOTE element tells XmlExecutor to connect to the JMX agent's RMIAdaptor. TRY groups elements together, so if one fails, it will skip the rest in the group so you don't have to wait for each element to fail. Use CREATEMBEAN to tell the JMX agent to instantiate a new MBean. COMMAND is the big advantage of XmlExecutor; it allows you to invoke methods on existing MBeans.

    BaseAgent
    JMX4ODP ships with org.jmx4odp. j4oNet.BaseServer as its JMX agent. It takes the HTMLAdaptor port and the RMIAdaptor port as its two arguments.

    Type

    > java org.jmx4odp.j4oNet.BaseServer 80801099

    to start the BaseServer. Now point a Web browser to localhost:8080 to see an HTML interface of your MBeans. JMXREMOTE will use port 1099.

    Now that you have a JMX agent with an RMIAdaptor running, you can create an XML Execute.xml file that will tell XmlExecutor to:
    1.  Create an EventRunnerMBean.
    2.  Invoke EventRunner.setFailureTopic to set the failure Notification type.
    3.  Invoke EventRunner.setErrorTopic to set the error Notification type.
    4.  Invoke EventRunner.SetSuiteAssemblerConfig to give the URL for your TestSuite.xml.
    5.  Invoke EventRunner.setSleepCount to set how many milliseconds to sleep between test cycles.
    6.  Create a NotificationMailer MBean.
    7.  Invoke NotificationMailer.setSmtpHost to set the host name of your mail gateway.
    8.  Invoke NotificationMailer.setSmtpUser and setSmtpPassword to set the username and password for your SMTP user if needed.
    9.  Invoke NotificationMailer.setSmtpPort if your gateway uses anything other than port 25.
    10.  Invoke NotificationMailer.setFrom Address to the address you want the notification e-mails to come from.
    11.  Invoke NotificationMailer.setSubject to set the e-mail subject line.
    12.  Invoke NotificationMailer.addTo Address to add an address to which to send notification e-mails.
    13.  Invoke NotificationMailer.setActive to activate the mailer; otherwise it will ignore all notifications while inactive.
    14.  Invoke NotificationMailer.add ListenedToObject to ."MONITOR: name=EventRunner,NotificationLogger=true," which will tell Notification Mailer to listen to the Notification Logger created by the EventRunner.
    15.  Invoke EventRunner.startDaemon to start the testing cycle.

    Figure 4 illustrates how JMX4ODP combines the JUnit tests and JMX management components to create a management system. If you use the example TestSuite.xml, you're testing if you can reach Yahoo. If this test fails, a JUnit event will be broadcast to all registered listeners. Your only listener right now is an MBean that will send out the event as an e-mail. If you start up a Web browser to http://localhost:8080, you'll see your JMX agent's HTMLAdaptor and all the new MBeans you started.

     
    Figure 4

    We've Only Just Begun...
    The most obvious ways to expand JMX4ODP is to:

  • Create custom tests.
  • Create custom NotificationListeners.

    The example we just used showed how to create an alert system. However, you could easily create a NotificationListener MBean that alters the system's state instead of telling your sysadmin to do it. For example, if your JBDC tester finds that your primary database has gone down, you could have a NotificationListener automatically start the failover procedure. Other possible directions would include automating start-up and shut-down via custom NotificationListeners; or monitoring log file size, network traffic, or response time via custom JUnit test beans.

    JMX and JUnit allow for loosely coupled designs that are modular, making it trivial to add and rearrange tests and responses. To add new actions, register new NotificationListeners. To change your test plans, update an XML file. Maintenance of your management suite should not be a full-time job. Your diagnostics and testing systems are no longer a coupled part of the target system. Once you've created common components, they can be used to manage new systems as they're developed.

    By using the JMX4ODP mode of design, management isn't an afterthought, but neither is it a burden of intense design or the lock-in of proprietary solutions. Management becomes another one of those things you get free when you use J2EE.

    Resource

  • JMX: http://java.sun.com/products/JavaManagement/index.html
  • More Stories By Lucas McGregor

    Lucas McGregor is the CTO of Xdrive where he manages their architecture and technology. Over the years he has designed distributed management systems for tier-1 national ISPs, massive online gaming systems, and consulted on projects ranging from distributed intelligent agents to
    automated protein analysis. He is interested in the architecture of robust
    and manageable distributed systems.

    Comments (1) View Comments

    Share your thoughts on this story.

    Add your comment
    You must be signed in to add a comment. Sign-in | Register

    In accordance with our Comment Policy, we encourage comments that are on topic, relevant and to-the-point. We will remove comments that include profanity, personal attacks, racial slurs, threats of violence, or other inappropriate material that violates our Terms and Conditions, and will block users who make repeated violations. We ask all readers to expect diversity of opinion and to treat one another with dignity and respect.


    Most Recent Comments
    bruno sarrant 11/18/03 03:48:47 AM EST

    you made a mistake on J4O URL reference. It''s http://jmx4odp.sourceforge.net/ and not http://jmx4-odp.sourceforge.net/

    cheers

    Bruno

    @ThingsExpo Stories
    SYS-CON Events announced today that Fusic will exhibit at the Japan External Trade Organization (JETRO) Pavilion at SYS-CON's 21st International Cloud Expo®, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. Fusic Co. provides mocks as virtual IoT devices. You can customize mocks, and get any amount of data at any time in your test. For more information, visit https://fusic.co.jp/english/.
    SYS-CON Events announced today that TMC has been named “Media Sponsor” of SYS-CON's 21st International Cloud Expo and Big Data at Cloud Expo, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. Global buyers rely on TMC’s content-driven marketplaces to make purchase decisions and navigate markets. Learn how we can help you reach your marketing goals.
    SYS-CON Events announced today that Enroute Lab will exhibit at the Japan External Trade Organization (JETRO) Pavilion at SYS-CON's 21st International Cloud Expo®, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. Enroute Lab is an industrial design, research and development company of unmanned robotic vehicle system. For more information, please visit http://elab.co.jp/.
    There is huge complexity in implementing a successful digital business that requires efficient on-premise and cloud back-end infrastructure, IT and Internet of Things (IoT) data, analytics, Machine Learning, Artificial Intelligence (AI) and Digital Applications. In the data center alone, there are physical and virtual infrastructures, multiple operating systems, multiple applications and new and emerging business and technological paradigms such as cloud computing and XaaS. And then there are pe...
    SYS-CON Events announced today that Daiya Industry will exhibit at the Japan External Trade Organization (JETRO) Pavilion at SYS-CON's 21st International Cloud Expo®, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. Daiya Industry specializes in orthotic support systems and assistive devices with pneumatic artificial muscles in order to contribute to an extended healthy life expectancy. For more information, please visit https://www.daiyak...
    Real IoT production deployments running at scale are collecting sensor data from hundreds / thousands / millions of devices. The goal is to take business-critical actions on the real-time data and find insights from stored datasets. In his session at @ThingsExpo, John Walicki, Watson IoT Developer Advocate at IBM Cloud, will provide a fast-paced developer journey that follows the IoT sensor data from generation, to edge gateway, to edge analytics, to encryption, to the IBM Bluemix cloud, to Wa...
    In his session at @ThingsExpo, Greg Gorman is the Director, IoT Developer Ecosystem, Watson IoT, will provide a short tutorial on Node-RED, a Node.js-based programming tool for wiring together hardware devices, APIs and online services in new and interesting ways. It provides a browser-based editor that makes it easy to wire together flows using a wide range of nodes in the palette that can be deployed to its runtime in a single-click. There is a large library of contributed nodes that help so...
    With major technology companies and startups seriously embracing Cloud strategies, now is the perfect time to attend 21st Cloud Expo October 31 - November 2, 2017, at the Santa Clara Convention Center, CA, and June 12-14, 2018, at the Javits Center in New York City, NY, and learn what is going on, contribute to the discussions, and ensure that your enterprise is on the right path to Digital Transformation.
    Agile has finally jumped the technology shark, expanding outside the software world. Enterprises are now increasingly adopting Agile practices across their organizations in order to successfully navigate the disruptive waters that threaten to drown them. In our quest for establishing change as a core competency in our organizations, this business-centric notion of Agile is an essential component of Agile Digital Transformation. In the years since the publication of the Agile Manifesto, the conn...
    SYS-CON Events announced today that App2Cloud will exhibit at SYS-CON's 21st International Cloud Expo®, which will take place on Oct. 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. App2Cloud is an online Platform, specializing in migrating legacy applications to any Cloud Providers (AWS, Azure, Google Cloud).
    WebRTC is great technology to build your own communication tools. It will be even more exciting experience it with advanced devices, such as a 360 Camera, 360 microphone, and a depth sensor camera. In his session at @ThingsExpo, Masashi Ganeko, a manager at INFOCOM Corporation, will introduce two experimental projects from his team and what they learned from them. "Shotoku Tamago" uses the robot audition software HARK to track speakers in 360 video of a remote party. "Virtual Teleport" uses a mu...
    Internet of @ThingsExpo, taking place October 31 - November 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA, is co-located with 21st Cloud Expo and will feature technical sessions from a rock star conference faculty and the leading industry players in the world. The Internet of Things (IoT) is the most profound change in personal and enterprise IT since the creation of the Worldwide Web more than 20 years ago. All major researchers estimate there will be tens of billions devic...
    Mobile device usage has increased exponentially during the past several years, as consumers rely on handhelds for everything from news and weather to banking and purchases. What can we expect in the next few years? The way in which we interact with our devices will fundamentally change, as businesses leverage Artificial Intelligence. We already see this taking shape as businesses leverage AI for cost savings and customer responsiveness. This trend will continue, as AI is used for more sophistica...
    SYS-CON Events announced today that SourceForge has been named “Media Sponsor” of SYS-CON's 21st International Cloud Expo, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. SourceForge is the largest, most trusted destination for Open Source Software development, collaboration, discovery and download on the web serving over 32 million viewers, 150 million downloads and over 460,000 active development projects each and every month.
    SYS-CON Events announced today that Massive Networks will exhibit at SYS-CON's 21st International Cloud Expo®, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. Massive Networks mission is simple. To help your business operate seamlessly with fast, reliable, and secure internet and network solutions. Improve your customer's experience with outstanding connections to your cloud.
    SYS-CON Events announced today that DXWorldExpo has been named “Global Sponsor” of SYS-CON's 21st International Cloud Expo, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. Digital Transformation is the key issue driving the global enterprise IT business. Digital Transformation is most prominent among Global 2000 enterprises and government institutions.
    SYS-CON Events announced today that WineSOFT will exhibit at SYS-CON's 21st International Cloud Expo®, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. Based in Seoul and Irvine, WineSOFT is an innovative software house focusing on internet infrastructure solutions. The venture started as a bootstrap start-up in 2010 by focusing on making the internet faster and more powerful. WineSOFT’s knowledge is based on the expertise of TCP/IP, VPN, SS...
    SYS-CON Events announced today that Akvelon will exhibit at SYS-CON's 21st International Cloud Expo®, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. Akvelon is a business and technology consulting firm that specializes in applying cutting-edge technology to problems in fields as diverse as mobile technology, sports technology, finance, and healthcare.
    SYS-CON Events announced today that TechTarget has been named “Media Sponsor” of SYS-CON's 21st International Cloud Expo, which will take place on Oct 31 – Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. TechTarget storage websites are the best online information resource for news, tips and expert advice for the storage, backup and disaster recovery markets.
    SYS-CON Events announced today that Dasher Technologies will exhibit at SYS-CON's 21st International Cloud Expo®, which will take place on Oct 31 - Nov 2, 2017, at the Santa Clara Convention Center in Santa Clara, CA. Dasher Technologies, Inc. ® is a premier IT solution provider that delivers expert technical resources along with trusted account executives to architect and deliver complete IT solutions and services to help our clients execute their goals, plans and objectives. Since 1999, we've...