JMX หรือ Java Management eXtensions คือเทคโนโลยีการจัดการ Application ที่ถูกเพิ่มเข้ามาใน Java SE 5 นิยมใช้กันอย่างมากใน J2EE 5 จะเห็นตัวอย่างได้จาก Weblogic server ของ Oracle ที่หน้าคอนโซลหน้าเว็บนั้นแทบจะเรียกผ่าน (operate) JMX ทั้งสิ้น ไม่ว่าจะเป็นการเปลี่ยนค่า อ่านค่า เป็นต้น

ความสามารถของ JMX มีหลักๆดังนี้

– การอ่านและเขียนข้อมูล (Set/Get method) : เช่นการอ่านจำนวน Thread, Current JDBC connection, Memory usage เหล่านี้สามารถทำผ่าน JMX ได้ทั้งสิ้น ซึ่งค่าที่อ่านได้นั้นจะอัพเดทตามการใช้งานจริง (ค่อนข้าง Real-time เนื่องจากเป็นการอ่านค่า ตัวแปรจาก Class ที่เราเขียนขึ้นมาจริงๆ )

– การแจ้งเตือน (Notification) : หากเราต้องการให้ระบบของเราแจ้งเตือน เมื่อเกิดเหตุการณ์อะไรบางอย่าง เช่น response time เกินกว่า SLA ที่ได้กำหนดไว้ เราก็สามารถตั้งการแจ้งเตือนผ่าน JMX ได้เช่นกัน โดยจำเป็นจะต้องมี subscriber มาคอยรับ message ที่ถูก broadcast ออกมา หลังจากได้รับการแจ้งเตือนแล้วก็ขึ้นอยู่กับเรา ว่าจะเขียนโปรแกรมให้ส่งข้อความนี้ออกไปทางไหน เช่น email/sms/xmpp (gtalk,facebook) เป็นต้น

หลัการทำงาน

ก่อนที่เราจะสามารถต่อเข้าไปจัดการ application ของเราได้นั้น เราจะต้องมี JMX Server เสียก่อน โดย JMX server นี้จะติดมากับ JVM อยู่แล้ว สิ่งที่เราต้องทำก็คือ การเชื่อมต่อเข้าไปใช้งาน หากต้องการให้ application ของเราสามารถเชื่อมต่อผ่านทาง network ได้ จะต้องมีการเพิ่ม java option ดังต่อไปนี้เพื่อให้เราสามารถใช้ jConsole เชื่อมต่อเข้าไปได้

” -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false” และถ้าหาก Server อยู่หลัง Firewall/Nat/Load Balancer จะต้องเพิ่ม -Djava.rmi.server.hostname=<DNS> เข้าไปด้วย

ตัวอย่างการ Implement JMX เข้ากับ Java application

ในตัวอย่างนี้ผมจะลอง reset cache (infinispan) ผ่าน JMX

เริ่มต้นโดยการสร้าง interface ที่ชื่อว่า InfinispanMGTMBean โดยเราจะใส่ method reset เข้าไปดังนี้

public interface InfinispanMGTMBean {
public void reset();
}

หลังจากนั้นก็ทำการสร้าง class InfinispanMGT ที่มี constructor ที่รับ Object Cache (infinispan cache) เข้ามา แล้วจึงทำการ implement interface ดัง code ด้านล่าง

public class InfinispanMGT implements InfinispanMGTMBean {

private Cache cache;

public InfinispanMGT(Cache cache) {
this.cache = cache;
}

@Override
public void reset() {
this.cache.clear();
}
}

จะเห็นได้ว่า class InfinispanMGT เป็น class java ธรรมดาที่ไม่ต้องการ library อะไรเพิ่มเติมทั้งสิ้น

เมื่อเราได้ class ที่ทำหน้าที่เป็น mbean (Managed bean) ของเราแล้วนั้น เราก็ต้องนำ class นี้ไป register กับ MBean server ดัง code ในส่วนต่อไปนี้

InfinispanMGT mbean = new InfinispanMGT(cache);
try {
ManagementFactory.getPlatformMBeanServer().registerMBean(mbean, new ObjectName(“com.krisa:type=InfinispanMGT”));
} catch (Exception e) {
e.printStackTrace();
}

จะเห็นว่าเราจะต้องกำหนดค่าของ ObjectName ซึ่งก็คือ ชื่อ package นั่นเอง ส่วน InfinisapnMGT นั้นเราสามารถเปลี่ยนชื่ออะไรก็ได้ ผลของการทำงานของ Code ทั้งหมด จะเห็นได้จากรูปด้านล่าง เมื่อเราทำการต่อเข้าไปยัง Mbean server ผ่านทาง jConsole จะเห็น package ของเรา รวมไปถึง method ที่เราได้ Implement ไว้ และเมื่อสั่ง reset แล้วจะเห็นว่า cache ของเราขนาดเหลือ 0 หมายความว่าโค้ดในส่วนนี้สามารถใช้งานได้จริง