JEUS JMX 안내서 JEUS v7.0 Fix#1 Copyright 2013 TmaxSoft Co., Ltd. All Rights Reserved.
Copyright Notice Copyright 2013 TmaxSoft Co., Ltd. All Rights Reserved. 대한민국경기도성남시분당구서현동 272-6 우 ) 463-824 Restricted Rights Legend All TmaxSoft Software (JEUS ) and documents are protected by copyright laws and international convention. TmaxSoft software and documents are made available under the terms of the TmaxSoft License Agreement and may only be used or copied in accordance with the terms of this agreement. No part of this document may be transmitted, copied, deployed, or reproduced in any form or by any means, electronic, mechanical, or optical, without the prior written consent of TmaxSoft Co., Ltd. 이소프트웨어 (JEUS ) 사용설명서의내용과프로그램은저작권법과국제조약에의해서보호받고있습니다. 사용설명서의내용과여기에설명된프로그램은 TmaxSoft Co., Ltd. 와의사용권계약하에서만사용이가능하며, 사용권계약을준수하는경우에만사용또는복제할수있습니다. 이사용설명서의전부또는일부분을 TmaxSoft의사전서면동의없이전자, 기계, 녹음등의수단을사용하여전송, 복제, 배포, 2차적저작물작성등의행위를하여서는안됩니다. Trademarks JEUS is registered trademark of TmaxSoft Co., Ltd. Other products, titles or services may be registered trademarks of their respective companies. JEUS 는 TmaxSoft Co., Ltd. 의등록상표입니다. 기타모든제품들과회사이름은각각해당소유주의상표로서참조용으로만사용됩니다. Open Source Software Notice Some modules or files of this product are subject to the terms of the following licenses. : APACHE2.0, CDDL1.0, EDL1.0, OPEN SYMPHONY SOFTWARE1.1, TRILEAD-SSH2, Bouncy Castle, BSD, MIT, SIL OPEN FONT1.1 Detailed Information related to the license can be found in the following directory : ${INSTALL_PATH/lib/licenses 본제품의일부파일또는모듈은다음의라이선스를준수합니다. : APACHE2.0, CDDL1.0, EDL1.0, OPEN SYM PHONY SOFTWARE1.1, TRILEAD-SSH2, Bouncy Castle, BSD, MIT, SIL OPEN FONT1.1 관련상세한정보는제품의다음의디렉터리에기재된사항을참고해주십시오. : ${INSTALL_PATH/lib/licenses 안내서정보안내서제목 : JEUS JMX 안내서발행일 : 2013-04-30 소프트웨어버전 : JEUS v7.0 Fix#1 안내서버전 : v2.1.2
내용목차 안내서에대하여... vii 제1장 MBean 정보조회... 1 1.1. WebAdmin 사용... 1 1.2. 콘솔툴사용... 2 제2장 JMX Manager 환경설정... 5 2.1. 개요... 5 2.2. 기본정보설정... 7 2.3. JMX Connector 설정... 8 2.3.1. JMXMP Connector... 9 2.3.2. RMI Connector... 9 2.4. SNMP Adaptor 설정... 10 제3장 JMX 애플리케이션개발... 11 3.1. JMX 애플리케이션구조... 11 3.2. MBean 서버연결... 12 3.2.1. JEUS 유틸리티사용... 12 3.2.2. JNDI 사용... 14 3.2.3. JMX Remote API 사용... 16 3.3. Security 설정... 19 3.4. MBean Object Names... 20 Appendix A. JMX 모니터링예제... 23 A.1. Servlet Thread Info 모니터링예제... 23 A.2. Thread Pool Info 모니터링예제... 26 A.3. JVM Info 모니터링예제... 28 A.4. JDBC DataSource(DB Connection Pool) 모니터링예제... 29 색인... 33 JEUS iii
그림목차 [ 그림 1.1] MBean 정보조회화면... 1 [ 그림 1.2] MBean 정보조회결과... 2 [ 그림 2.1] 메인화면... 5 [ 그림 2.2] Server 목록화면... 6 [ 그림 2.3] Jmx Manager 설정화면... 6 [ 그림 2.4] Jmx Manager 기본정보설정... 7 [ 그림 2.5] HTML Adaptor 접속화면... 8 [ 그림 2.6] JMXMP Connector 설정... 9 [ 그림 2.7] RMI Connector 설정... 9 [ 그림 2.8] SNMP Adaptor 설정... 10 JEUS v
안내서에대하여 안내서의대상 본안내서는 JEUS 에서 JMX 를관리하고, 유지하는시스템관리자나관계자를대상으로 JEUS JMX 모듈 을사용하기위한내용을설명한다. 안내서의전제조건 본안내서를원활하게이해하기위해서는다음과같은사항을미리알고있어야한다. JEUS의웹서비스에대한이해 ("JEUS Web Service 안내서 " 참고 ) JMX 개발에대한기본지식 (http://www.oracle.com/technetwork/java/index.html에서스펙이나기타 JMX 관련문서참고 ) 안내서의제한조건 본안내서에서는 Java EE 나 JMX 기술에대한기본적인내용은다루지않는다. 따라서해당내용은 Java 관련문서를참고한다. 안내서에대하여 vii
안내서구성 본안내서는총 3개의장과 1개의 Appendix로구성되어있다. 제1장 MBean 정보조회 현재 JEUS에등록되어있는 MBean을조회하는방법을설명한다. 제2장 JMX Manager 환경설정 JEUS 환경설정방법에대해서설명한다. 제3장 JMX 애플리케이션개발 JEUS JMX 클라이언트애플리케이션을개발하는방법과그것을설치하는방법에대해서설명한다. Appendix A. JMX 모니터링예제 JEUS MBean 정보를모니터링하는예제를설명한다. viii JEUS JMX 안내서
안내서규약 표기 <<AaBbCc123>> <Ctrl>+C [Button] 진하게 " "( 따옴표 ) ' 입력항목 ' 하이퍼링크 > +---- ---- 참고주의 [ 그림 1.1] [ 표 1.1] AaBbCc123 의미프로그램소스코드의파일명 Ctrl과 C를동시에누름 GUI의버튼또는메뉴이름강조다른관련안내서또는안내서내의다른장및절언급화면 UI에서입력항목에대한설명메일계정, 웹사이트메뉴의진행순서하위디렉터리또는파일있음하위디렉터리또는파일없음참고또는주의사항주의할사항그림이름표이름 Java 코드, XML 문서 [ command argument ] < xyz > 옵션파라미터 < 와 > 사이의내용이실제값으로변경됨선택사항. 예 ) A B: A나 B 중하나파라미터등이반복되어서나옴 안내서에대하여 ix
시스템사용환경 본안내서의모든예제와환경구성은 UNIX의스타일에준하여작성되어 Microsoft Windows ( 이하 Windows) 와같이다른환경에서작업하는경우몇가지사항을고려해야한다. 예를들어경로구분자의경우 UNIX 스타일인 / 를 Windows 스타일인 \ 로바꿔서사용한다. 또한환경변수도 Windows 스타일로변경해서사용하면된다. 문서의내용은 Java 표준을고려해서작성했기때문에대부분의내용은동일하게적용된다. 관련안내서 안내서 JEUS Server 안내서 JEUS SNMP 안내서 JEUS WebAdmin 안내서 JEUS Web Service 안내서 JEUS Reference Book JEUS XML Reference 설명 JEUS 시스템과서버의개요와시스템관리를위한안내서이다. 산업표준인 SNMP 프로토콜을이용한 JEUS 모니터링에대해설명한안내서이다. JEUS의웹관리툴인 WebAdmin을사용한 JEUS 의설정및제어, 모니터링, 클러스터링, 리소스설정및관리에대해기술한안내서이다. JEUS 내의웹서비스에대해기술한안내서이다. JEUS를사용할때도움이되는 Reference를기술한안내서이다. JEUS관련 XML의설정방법에대해기술한안내서이다. 참고자료 Java EE 6 Specification Java EE management 1.1 Specification JMX 1.2 Specification JMX Remote API 1.0 Specification x JEUS JMX 안내서
연락처 Korea TmaxSoft Co., Ltd 272-6, Seohyeon-dong, Bundang-gu, Seongnam-si, Gyeonggi-do, 463-824 South Korea Tel: +82-31-8018-1000 Fax: +82-31-8018-1115 Email: info@tmax.co.kr Web (Korean): http://www.tmax.co.kr 기술지원 : http://technet.tmaxsoft.com USA TmaxSoft, Inc. 560 Sylvan Avenue Englewood Cliffs, NJ 07632 U.S.A Tel: +1-201-567-8266 Fax: +1-201-567-7339 Email: info@tmaxsoft.com Web (English): http://www.tmaxsoft.com Japan TmaxSoft Japan Co., Ltd. 5F Sanko Bldg, 3-12-16 Mita, Minato-Ku, Tokyo, 108-0073 Japan Tel: +81-3-5765-2550 Fax: +81-3-5765-2567 Email: info@tmaxsoft.co.jp Web (Japanese): http://www.tmaxsoft.co.jp 안내서에대하여 xi
China TmaxSoft China Co., Ltd. Beijing Silver Tower, RM 1508, 2# North Rd Dong San Huan, Chaoyang District, Beijing, China, 100027 China Tel: +86-10-6410-6145~8 Fax: +86-10-6410-6144 Email: info.cn@tmaxsoft.com Web (Chinese): http://www.tmaxsoft.com.cn xii JEUS JMX 안내서
제 1 장 MBean 정보조회 본장에서는 WebAdmin 과콘솔툴 (jeusadmin) 로 JEUS 에서사용하고있는 MBean 의정보를조회하는방 법에대해서설명한다. 1.1. WebAdmin 사용 WebAdmin를사용하여 MBean 정보를조회할수있다. 왼쪽메뉴에서 [Monitoring] > [MBean] 메뉴를선택하면 MBean 정보를조회하는화면이나타난다. [ 그림 1.1] MBean 정보조회화면 제 1 장 MBean 정보조회 1
MBean 정보조회화면에서조회할서버를선택하면조회결과화면이나타난다. [ 그림 1.2] MBean 정보조회결과 1.2. 콘솔툴사용 콘솔툴 (jeusadmin) 을사용해서 MBean 정보를조회할수있다. jeusadmin 툴을통해 JEUS 서버에접속한후 mbean-info 명령어를이용하면다음과같이등록된 MBean 정보를조회할수있다. JEUS7 Administration Tool [DAS]domain1.adminServer>mbean-info -server adminserver ObjectName of MBeans on the server [adminserver] ================================================================================ +------------------------------------------------------------------------------+ ObjectName of MBean +------------------------------------------------------------------------------+ JEUS:j2eeType=JeusService,jeusType=SecuritySubject,JMXManager=adminServer,J2E EDomain=domain1,SecurityDomain=SYSTEM_DOMAIN,name=Subject JEUS:j2eeType=JeusService,jeusType=EJBEngine,JMXManager=adminServer,J2EEServe r=adminserver,name=adminserver_ejb... JEUS:j2eeType=JMSResource,JMXManager=adminServer,J2EEServer=adminServer,name= adminserver_jms JEUS:j2eeType=JeusService,jeusType=ThreadPool_WEBC,JMXManager=adminServer,Web Engine=adminServer_servlet,J2EEServer=adminServer,WebListener=ADMIN-HTTP,name= 2 JEUS JMX 안내서
ADMIN-HTTP +------------------------------------------------------------------------------+ ================================================================================ [DAS]domain1.adminServer> 제 1 장 MBean 정보조회 3
제 2 장 JMX Manager 환경설정 본장에서는 JMX Manager 의환경을설정하는방법에대해서설명한다. 2.1. 개요 JMX Remote API 스펙 1.0을따르는클라이언트애플리케이션에게 JEUS JMX는 JEUS의구성과실시간정보를제공한다. WebAdmin 메인화면에서설정을변경할 Server 이름을선택하거나, 왼쪽메뉴에서 [Servers] 메뉴를선택한후조회되는 Server 목록화면에서서버를선택한다. [ 그림 2.1] 메인화면 제 2 장 JMX Manager 환경설정 5
[ 그림 2.2] Server 목록화면 설정을변경할서버를선택한후 [Resource] 탭에서 [Jmx Manager] 메뉴를선택하면, 다음과같이 Jmx Manager 설정화면이나타난다. [ 그림 2.3] Jmx Manager 설정화면 6 JEUS JMX 안내서
Jmx Manager 설정화면은다음의 3가지의관리화면로 JEUS 모니터링정보에액세스하는방법을제공한다. 기본정보설정 HTML Adaptor Port와 MLet URL 정보를설정한다. JMX Connector 다른프로세스에서해당서버의 JMX를액세스할때사용하는 JMX Connector를설정한다. 기본적으로는 JMXMP Connector를사용한다. SNMP Adaptor JMX의 Adaptor 중하나인 SNMP Adaptor를설정한다. JMX Connector 와 SNMP Adaptor 은해당항목의체크박스를선택해야설정항목이활성화된다. 각항목 에대한자세한설정방법은해당절의설명을참고한다. 2.2. 기본정보설정 본절에서는 Jmx Manager 기본정보를설정하는방법에대해서설명한다. 'Html Adaptor Port' 와 'MLet Url' 항목을설정하는경우서버를재시작해야한다. [ 그림 2.4] Jmx Manager 기본정보설정 HTML Adaptor Port HTML Adaptor는 HTML을지원하는 JMX의 Protocol Adapter이다. HTML Adaptor Port는 HTML Adapter의 Listener Port로웹브라우저로접속할 HTML Adapter의 Port를지정한다. Port를 -1로설정을하면 JMX Manager가 HTML Protocol을사용하지않음을의미한다. Port 를설정할때다른서비스가사용하는 Port를사용하지않도록주의해서설정한다. HTML Adaptor 설정이정상적으로이루어졌는지확인하려면, 웹브라우저를실행한후서버 IP와설정한 Port 값을사용해서버에접속해본다. 다음은 HTML 어댑터가정상적으로동작하고있는경우의접속화면이다. 제 2 장 JMX Manager 환경설정 7
[ 그림 2.5] HTML Adaptor 접속화면 참고 HTML Adaptor에대한추가적인사항은 http://java.sun.com/developer/technicalarticles/j2se/jmx.html 의설명을참고한다. MLet URL 서버의 MBean 서버에등록할 MLet URL을설정한다. 설정한 MLet URL을적용하기위해서는서버를재시작해야한다. 참고 MLet 에대한자세한설명은 http://docs.oracle.com/javaee/1.4/api/javax/management/loading/mlet.html 의설명을참고한다. 2.3. JMX Connector 설정 JMX Connector는 JMX Remote API에서정의되어있는리모트에서 JMX MBeanServer에접근하기위한 Connector로제공되는 Connector는다음과같다. 소켓기반의 JMXMP Connector Remote API에정의되어있는 RMI Connector 기본적으로 JMXMP Connector를사용하며, WebAdmin을사용해서설정을변경할수있다. 8 JEUS JMX 안내서
2.3.1. JMXMP Connector JMX를액세스할때사용할리스너를지정한다. 지정하지않은경우기본통합포트리스너를 JMXMP Connector를위해사용한다. 다음 'Listener Ref ' 항목에사용할리스너이름을설정한다. [ 그림 2.6] JMXMP Connector 설정 참고 JMXMP Connector 설정을반영하기위해서는서버를재시작해야한다. 리스너설정에관한자세한 내용은 JEUS Server 안내서 의 2.3.2. Listener 설정 을참고한다. 2.3.2. RMI Connector RMI Connector를설정하기위해서 'Rmi Connector' 를체크해야항목설정이활성화된다. JMXMP Connector와같이설정되어있는경우에는 JEUS 시스템내부적으로 JMXMP Connector를사용하게된다. 이경우에는 'Ref Export Name'(Reference Export Name) 이별도로설정되어있어야한다. Reference Export Name이 JEUS에서기본적으로사용하는이름과같거나설정이되어있지않다면 Excep tion이발생한다. 다음은 WebaAdmin에서 RMI Connector를설정하는화면이다. [ 그림 2.7] RMI Connector 설정 참고 RMI Connector 설정을반영하기위해서는서버를재시작해야한다. 제 2 장 JMX Manager 환경설정 9
RMI Connector 설정이정상적으로반영되어서버를시작할때다음과같은로그를확인할수있다. 'Export Name' 을 'RMIConnector' 로설정하고, 'Rmi Connector Port' 를 '9999' 로설정했을때출력하는로그메시지이다. IP 주소는실행하는머신에따라달라질수있다.... [2012.06.27 15:03:57][2] [adminserver-1] [JMX-0132] The RMIConnector service url is service:jmx:rmi://127.0.0.1:9999/jndi/rmiconnector... 2.4. SNMP Adaptor 설정 SNMP Adaptor는 JMX가제공하는 SNMP Protocol Adapter이다. 'Snmp Adaptor' 를체크해야항목설정이활성화된다. 다음은 WebAdmin에서 SNMP Adaptor를설정하는화면이다. [ 그림 2.8] SNMP Adaptor 설정 참고 SNMP 와 SNMP Adaptor 설정에대한자세한설명은 JEUS SNMP 안내서 의 제 2 장 SNMP Agent 설정 을참고한다. 10 JEUS JMX 안내서
제 3 장 JMX 애플리케이션개발 JEUS 모니터링서비스를사용하기위한 JEUS JMX 클라이언트애플리케이션의개발및설치방법에대 해서설명한다. 3.1. JMX 애플리케이션구조 애플리케이션의구조는필요에따라다양한형태가있다. JEUS JMX 클라이언트애플리케이션은일반적인구조로구성되어있고, 구성된구조를따라수행한다. 다음은 JMX 클라이언트애플리케이션의수행구조및과정이다. 1. 환경설정 ( 옵션사항 ) JMX 클라이언트애플리케이션을위해환경을설정한다. 환경설정을 MBeanServer에연결하기전에할수있다. 처리하려는 MBean을질의하고, 그결과를받아서처리할수있다. 기본적인환경설정에대한자세한내용은 제2장 JMX Manager 환경설정 의내용을참고한다. 2. MBean 서버연결 MBean 서버로접속하기위한방법은다음과같다. jeus.management.remotembeanserverfactory는 JEUS 유틸리티를사용한다. JNDI에등록되어있는 reference를사용한다. JMX Remote javax.management.remote.jmxserviceurl을사용하여 javax.management.remote.jmx Connector를얻을수있다. 각방법에대한자세한내용은각절의설명을참고한다. 3. 질의 4. 질의결과처리그외에 JEUS 모니터링서비스를위한보안설정방법과 JEUS JMX에서 ObjectName을생성하는규칙에대해서설명한다. 또한 JEUS 모니터링은 SNMP를사용할수도있다. 사용방법에대한자세한내용은 "JEUS SNMP 안내서 " 를참고한다. 참고본장에서설명하는내용을이해하기위해서 JMX Remote API 1.0과 Java EE Management 스펙에대한기본지식이필요하다. JMX Remote API에대한자세한정보는 Oracle에서제공하는 J2EE JMX Remote API 1.0 스펙과 JMX Remote API를참고한다. 제 3 장 JMX 애플리케이션개발 11
3.2. MBean 서버연결 본절에서는 MBean 서버로접속하기위한방법에대해서설명한다. 3.2.1. JEUS 유틸리티사용 본절에서는 JEUS 유틸리티클래스인 jeus.management.remotembeanserverfactory를사용해서 JEUS 를모니터링하는 JMX 애플리케이션에대해서설명한다. "MBean 서버연결 " 부분이다른방법과차이가있다. 다음은 JEUS 유틸리티를사용하는클라이언트예제이다. package jmxclient; import java.util.set; import java.util.iterator; import java.util.hashtable; import javax.management.objectname; import javax.management.mbeanserverconnection; import javax.naming.context; /** * JMX Client which uses JEUS utility (RemoteMBeanServerFactory) class. */ public class JMXClientUsingJeusUtility { public static void main(string args[]) throws Exception { if(args.length < 3) { System.out.println("Required arguments: hostname username password"); return; // Step 1. Setting Environments String hostname = args[0]; String username = args[1]; String password = args[2]; Hashtable env = new Hashtable(); env.put(context.initial_context_factory, "jeus.jndi.jnscontextfactory"); env.put(context.provider_url, hostname); env.put(context.security_principal, username); env.put(context.security_credentials, password); // Step 2. Getting MBeanServer MBeanServerConnection mbeanserver = jeus.management.remotembeanserverfactory.getmbeanserver(env); 12 JEUS JMX 안내서
// Step 3. Query ObjectName jeusscope = new ObjectName("JEUS:*"); Set objectnames = mbeanserver.querynames(jeusscope, null); // Step 4. Handling the Query Result for(iterator i = objectnames.iterator(); i.hasnext();) { System.out.println("[MBean] " + i.next()); "MBean 서버연결 " 에서 JEUS 가제공하는 JEUS 유틸리티클래스인 jeus.management.remotem BeanServerFactory 를사용했다. 이클래스를사용하면간단하게 MBeanServerConnection 을얻을수있 다. 위예제를작성한후컴파일하여실행하면 JEUS 서버에접속한후 "JEUS:*" 에해당하는 MBean들의목록을출력한다. 예제프로그램은인자를 3개받는데, 첫번째는서버의 hostname, 두번째는 JEUS 사용자이름, 마지막은비밀번호이다. user1@host1:~$ java -classpath.:$jeus_home/lib/client/jclient.jar jmxclient.jmxclientusingjeusutility 127.0.0.1 administrator jeus [2012.06.27 15:42:45][2] [t-1] [Network-0405] [Endpoint] exporting Endpoint (0:61.77.153.227:9756:-1:0x2CAD872D). [2012.06.27 15:42:45][2] [t-1] [Network-0002] [Acceptor] start to listen NonBlockingChannelAcceptor: /61.77.153.227:9756. [MBean] JEUS:j2eeType=JeusService,jeusType=ThreadPool,JMXManager=adminServer, J2EEServer=adminServer,name=threadpool.System [MBean] JEUS:j2eeType=JeusService,jeusType=JEUSMPConnector, JMXManager=adminServer,J2EEServer=adminServer,name=adminServer [MBean] JEUS:j2eeType=JeusService,jeusType=JMSDestinationResource, JMXManager=adminServer,J2EEServer=adminServer,JMSResource=adminServer_jms, name=examplesqueue [MBean] JEUS:j2eeType=WebModule,JMXManager=adminServer, J2EEServer=adminServer,J2EEApplication=null,WebEngine=adminServer_servlet,name=webadmin [MBean] JEUS:j2eeType=JeusService,jeusType=SessionContainer,JMXManager=adminServer, WebEngine=adminServer_servlet,J2EEServer=adminServer,name=_webadmin [MBean] JEUS:j2eeType=JeusService,jeusType=ThreadPool,JMXManager=adminServer, J2EEServer=adminServer,name=AsyncServletBackgroundProcessor-webadmin [MBean] JEUS:j2eeType=JeusService,jeusType=JeusLogService,JMXManager=adminServer, J2EEServer=adminServer,name=adminServer [MBean] JEUS:j2eeType=JeusService,jeusType=ThreadPool_WEBC,JMXManager=adminServer, WebEngine=adminServer_servlet,J2EEServer=adminServer,WebListener=http1,name=http1 [MBean] JEUS:j2eeType=JeusService,jeusType=SecurityDomain,JMXManager=adminServer, J2EEDomain=domain1,SecurityService=SecurityService,name=SYSTEM_DOMAIN [MBean] 제 3 장 JMX 애플리케이션개발 13
JEUS:j2eeType=JeusService,jeusType=JMSConnectionFactoryResource,JMXManager=adminServer, J2EEServer=adminServer,JMSResource=adminServer_jms,name=TopicConnectionFactory [MBean] JEUS:j2eeType=JeusService,jeusType=SnmpAgentService,JMXManager=adminServer, J2EEServer=adminServer,name=adminServer... 참고 예제프로그램은 jclient.jar 가있어야실행할수있다. 기본적으로 jclient.jar 는 JEUS_HOME/lib/client 아래에위치한다. 3.2.2. JNDI 사용 본절에서는 JNDI를사용해서 JEUS를모니터링하는 JMX 애플리케이션에대해서설명한다. "MBean 서버연결 " 부분이다른방법과차이가있다. 다음은 JNDI를사용하는클라이언트예제이다. package jmxclient; import java.util.set; import java.util.iterator; import java.util.hashtable; import javax.management.mbeanserverconnection; import javax.management.objectname; import javax.management.remote.jmxconnector; import javax.naming.context; import javax.naming.initialcontext; /** * JMX Client which uses JNDI lookup. */ public class JMXClientUsingJndi { public static void main(string args[]) throws Exception { if(args.length < 4) { System.out.println("Required arguments: " + "hostname username password target-name"); return; // Step 1. Setting Environments String hostname = args[0]; String username = args[1]; String password = args[2]; 14 JEUS JMX 안내서
// targetname could be server name, // for example, "adminserver", "server1" String targetname = args[3]; Hashtable env = new Hashtable(); env.put(context.initial_context_factory, "jeus.jndi.jeuscontextfactory"); env.put(context.provider_url, hostname); env.put(context.security_principal, username); env.put(context.security_credentials, password); // Step 2. Getting MBeanServerConnection InitialContext ctx = new InitialContext(env); JMXConnector connector = (JMXConnector)ctx.lookup("mgmt/rmbs/" + targetname); MBeanServerConnection mbeanserver = connector.getmbeanserverconnection(); // Step 3. Query ObjectName jeusscope = new ObjectName("JEUS:*"); Set objectnames = mbeanserver.querynames(jeusscope, null); // Step 4. Handling the Query Result for(iterator i = objectnames.iterator(); i.hasnext();) { System.out.println("[MBean] " + i.next()); JNDI에서 Lookup할때에는등록되어있는 Connector(RMI Connector/JMXMP Connector) 의종류에관계없이같은방식으로사용이가능하다. Lookup할때사용하는 Export Name은여기서는 JEUS에서사용하는기본 naming 방식을사용했다. 이방식은 JNDI context mgmt/rmbs/<server-name> 형태의이름을사용한다. 위예제를작성한후컴파일하여실행하면 JEUS 서버에접속한후 "JEUS:*" 에해당하는 MBean들의목록을출력한다. 예제프로그램은인자를 4개받는데, 첫번째는서버의 hostname, 두번째는 JEUS 사용자이름, 세번째는비밀번호, 마지막은서버이름이다. user1@host1:~$ java -classpath.:$jeus_home/lib/client/jclient.jar jmxclient.jmxclientusingjndi 127.0.0.1 jeus jeus adminserver [2012.06.27 15:42:45][2] [t-1] [Network-0405] [Endpoint] exporting Endpoint (0:61.77.153.227:9756:-1:0x2CAD872D). [2012.06.27 15:42:45][2] [t-1] [Network-0002] [Acceptor] start to listen NonBlockingChannelAcceptor: /61.77.153.227:9756. [MBean] JEUS:j2eeType=JeusService,jeusType=ThreadPool, JMXManager=adminServer,J2EEServer=adminServer,name=threadpool.System [MBean] JEUS:j2eeType=JeusService,jeusType=JEUSMPConnector, JMXManager=adminServer,J2EEServer=adminServer,name=adminServer 제 3 장 JMX 애플리케이션개발 15
[MBean] JEUS:j2eeType=JeusService,jeusType=JMSDestinationResource, JMXManager=adminServer,J2EEServer=adminServer,JMSResource=adminServer_jms,name=ExamplesQueue [MBean] JEUS:j2eeType=WebModule,JMXManager=adminServer,J2EEServer=adminServer, J2EEApplication=null,WebEngine=adminServer_servlet,name=webadmin [MBean] JEUS:j2eeType=JeusService,jeusType=SessionContainer,JMXManager=adminServer, WebEngine=adminServer_servlet,J2EEServer=adminServer,name=_webadmin [MBean] JEUS:j2eeType=JeusService,jeusType=ThreadPool,JMXManager=adminServer, J2EEServer=adminServer,name=AsyncServletBackgroundProcessor-webadmin [MBean] JEUS:j2eeType=JeusService,jeusType=JeusLogService,JMXManager=adminServer, J2EEServer=adminServer,name=adminServer [MBean] JEUS:j2eeType=JeusService,jeusType=ThreadPool_WEBC,JMXManager=adminServer, WebEngine=adminServer_servlet,J2EEServer=adminServer,WebListener=http1,name=http1 [MBean] JEUS:j2eeType=JeusService,jeusType=SecurityDomain,JMXManager=adminServer, J2EEDomain=domain1,SecurityService=SecurityService,name=SYSTEM_DOMAIN [MBean] JEUS:j2eeType=JeusService,jeusType=JMSConnectionFactoryResource, JMXManager=adminServer,J2EEServer=adminServer,JMSResource=adminServer_jms,name=TopicConnectionFactory [MBean] JEUS:j2eeType=JeusService,jeusType=SnmpAgentService, JMXManager=adminServer,J2EEServer=adminServer,name=adminServer... 그외에 RMI Connector 의경우에는 JMXMP Connector 가별도로띄워져있는경우에기본방식이외의 이름을 reference export name 으로지정할수있다. 참고 1. 예제프로그램은 jclient.jar가있어야실행할수있다. 기본적으로 jclient.jar는 JEUS_HOME/lib/client 아래에위치한다. 2. RMI Connector 설정의자세한내용은 2.3.2. RMI Connector 를참고한다. 3. JNDI의자세한정보에대해서는 JEUS Server 안내서 의 제4장 JNDI Naming Server 를참고한다. 만약에 JMX 애플리케이션이서블릿또는 EJB에서실행된다면 JNDI 파라미터에대한설정은필요하지않다. 3.2.3. JMX Remote API 사용 본절에서는 JMX Remote API를사용해서 JEUS를모니터링하는 JMX 애플리케이션에대해서설명한다. "MBean 서버연결 " 부분이다른방법과차이가있다. 다음은 JMX Remote API를사용하는클라이언트예제이다. package jmxclient; import java.util.set; import java.util.iterator; import java.util.hashtable; 16 JEUS JMX 안내서
import javax.management.mbeanserverconnection; import javax.management.objectname; import javax.management.remote.jmxserviceurl; import javax.management.remote.jmxconnector; import javax.management.remote.jmxconnectorfactory; import javax.naming.context; /** * JMX Client which uses JMX Service URL. * RMI Connector should be turned on in JEUS * and the JNDI name of it is required here. */ public class JMXClientUsingJmxUrl { public static void main(string args[]) throws Exception { if(args.length < 4) { System.out.println("Required arguments: " + "hostname username password connector-exportname"); return; // Step 1. Setting Environments String hostname = args[0]; String username = args[1]; String password = args[2]; // the JMX RMIConnector export name String exportname = args[3]; Hashtable env = new Hashtable(); env.put(context.initial_context_factory, "jeus.jndi.jnscontextfactory"); env.put(context.provider_url, hostname); env.put(context.security_principal, username); env.put(context.security_credentials, password); // Step 2. Getting MBeanServer JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/" + exportname); try { JMXConnector connector = null; connector = JMXConnectorFactory.newJMXConnector(url,env); // connect to JMXConnectorServer connector.connect(); MBeanServerConnection mbeanserver = connector.getmbeanserverconnection(); // Step 3. Query 제 3 장 JMX 애플리케이션개발 17
ObjectName jeusscope = new ObjectName("JEUS:*"); Set objectnames = mbeanserver.querynames(jeusscope, null); // Step 4. Handling the Query Result for(iterator i = objectnames.iterator(); i.hasnext();) { System.out.println("[MBean] " + i.next()); finally { // Always close the JMXConnector connector.close(); 참고 JMX Remote API 를사용하기위해서는 JMX Manager 에있는 'RMI Connector' 항목을설정해야한 다. RMI Connector 설정에대한자세한내용은 2.3.2. RMI Connector 를참고한다. 위예제를작성한후컴파일하여실행하면 JEUS 서버에접속한후 "JEUS:*" 에해당하는 MBean들의목록을출력한다. 예제프로그램은인자를 4개받는데, 첫번째는서버의 hostname, 두번째는 JEUS 사용자이름, 세번째는비밀번호, 마지막은 RMI Connector ExportName이다. 다음실행결과에서는 'ExportName' 을 'RMIConnector' 로설정한경우이다. user1@host1:~$ java -classpath.:$jeus_home/lib/client/jclient.jar jmxclient.jmxclientusingjmxurl 127.0.0.1 jeus jeus RMIConnector [2012.06.27 15:42:45][2] [t-1] [Network-0405] [Endpoint] exporting Endpoint (0:61.77.153.227:9756:-1:0x2CAD872D). [2012.06.27 15:42:45][2] [t-1] [Network-0002] [Acceptor] start to listen NonBlockingChannelAcceptor: /61.77.153.227:9756. [MBean] JEUS:j2eeType=JeusService,jeusType=ThreadPool,JMXManager=adminServer, J2EEServer=adminServer,name=threadpool.System [MBean] JEUS:j2eeType=JeusService,jeusType=JEUSMPConnector,JMXManager=adminServer, J2EEServer=adminServer,name=adminServer [MBean] JEUS:j2eeType=JeusService,jeusType=JMSDestinationResource, JMXManager=adminServer,J2EEServer=adminServer,JMSResource=adminServer_jms,name=ExamplesQueue [MBean] JEUS:j2eeType=WebModule,JMXManager=adminServer,J2EEServer=adminServer, J2EEApplication=null,WebEngine=adminServer_servlet,name=webadmin [MBean] JEUS:j2eeType=JeusService,jeusType=SessionContainer,JMXManager=adminServer, WebEngine=adminServer_servlet,J2EEServer=adminServer,name=_webadmin [MBean] JEUS:j2eeType=JeusService,jeusType=ThreadPool,JMXManager=adminServer, J2EEServer=adminServer,name=AsyncServletBackgroundProcessor-webadmin [MBean] JEUS:j2eeType=JeusService,jeusType=JeusLogService,JMXManager=adminServer, J2EEServer=adminServer,name=adminServer [MBean] JEUS:j2eeType=JeusService,jeusType=ThreadPool_WEBC,JMXManager=adminServer, 18 JEUS JMX 안내서
WebEngine=adminServer_servlet,J2EEServer=adminServer,WebListener=http1,name=http1 [MBean] JEUS:j2eeType=JeusService,jeusType=SecurityDomain,JMXManager=adminServer, J2EEDomain=domain1,SecurityService=SecurityService,name=SYSTEM_DOMAIN [MBean] JEUS:j2eeType=JeusService,jeusType=JMSConnectionFactoryResource, JMXManager=adminServer,J2EEServer=adminServer,JMSResource=adminServer_jms,name=TopicConnectionFactory [MBean] JEUS:j2eeType=JeusService,jeusType=SnmpAgentService,JMXManager=adminServer, J2EEServer=adminServer,name=adminServer... 참고 예제프로그램은 jclient.jar 가있어야실행할수있다. 기본적으로 jclient.jar 는 JEUS_HOME/lib/client 아래에위치한다. 3.3. Security 설정 JMX를사용하여 JEUS 서버에등록되어있는여러 MBean들이제공하는속성을읽거나작업할경우 JEUS 는해당연결을맺은사용자가속성을읽을권한이있는지작업을수행할권한이있는지를검사한다. 각각 MBean을사용할때필요한권한에대한정보는 JEUS API 문서를참고한다. API 문서는다음위치에서찾을수있다. JEUS_HOME/docs/api 참고 API 문서는 MBean 을사용할때필요한권한 (Permission Name) 뿐만아니라 ObjectNamePattern, 속 성 (Attribute), 작업 (Operation) 등에대한정보도제공하고있다. JMX 애플리케이션에서사용자이름이나비밀번호와같은정보는서버에접속해서 MBeanServerConnection 을생성할때제공한다. 일반적으로 MBeanServerConnection을생성할때는다음과같은코드를사용하는데, 코드를살펴보면 Hashtable로전달하는환경설정정보에사용자이름과비밀번호가들어가는것을확인할수있다.... JMXServiceURL serviceurl = new JMXServiceURL("service:jmx:jmxmp://127.0.0.1:9999/adminServer"); Map<String, Object> env = new HashMap<String, Object>(); env.put(context.security_principal, id); env.put(context.security_credentials, password); env.put(context.initial_context_factory, "jeus.jndi.jeuscontextfactory"); env.put("jmx.remote.x.request.timeout", "10"); 제 3 장 JMX 애플리케이션개발 19
JMXConnector connector = JMXConnectorFactory.connect(serviceURL, env); MBeanServerConnection connection = connector.getmbeanserverconnection();... 이때사용하는사용자이름과비밀번호, 권한설정은 JEUS Security를이용해서설정한다. JEUS Security 설정방법에대한자세한내용은 JEUS Security 안내서 의 2.5. 보안시스템사용자정보설정 과 JEUS Security 안내서 의 2.6. 보안시스템정책설정 을참고한다. 3.4. MBean Object Names ObjectName은 MBean 객체의기본 JMX 객체이름이다. ObjectName의형식은 JMX 표준형식이지만 JMX 구현이각각다르기때문에특정벤더에따라값이달라질수있다. JMX MBean들의계층구조는벤더마다다르고, MBean들도벤더에따라여러가지가있다. JEUS ObjectName의문법은다음과같다. <domain_name>: j2eetype=<j2eetype_value>, name=<name_value>, [<parent-j2eetype_value>], [jeustype = <jeustype_value>], [istargetable = <istargetable_value>], JMXManager = <JMXManager_value> [,*] 또는 <domain_name>: * ObjectName은 <domain_name> 으로시작해야하고, 각이름과값의짝이순차적으로규정되지않는다. 예를들면, 다음은둘다 JEUS 도메인 MBean의 objectname을얻어온다. JEUS:j2eeType=J2EEDomain,JMXManager=adminServer, * JEUS:JMXManager=adminServer, j2eetype=j2eedomain, * 다음은각항목에대한설명이다. <domain_name> ObjectName의도메인이름으로값은 'JEUS' 이다. j2eetype MBean은 J2EE 타입이며, J2EE Management 스펙에의해기술된다. 다음값들중하나를설정한다. AppClientModule J2EEApplication JAXRResource JCAResource EJBModule J2EEDomain JCAConnectionFactory JDBCDataSource EntityBean J2EEServer JCAManagedConnectionFactory JDBCDriver 20 JEUS JMX 안내서
JDBCResource JTAResource JeusService ResourceAdapterModule StatelessSessionBean JMSResource JVM MessageDrivenBean Servlet URLResource JNDIResource JavaMailResource ResourceAdaptor StatefulSessionBean WebModule name MBean의이름으로각각의 MBean Object에는유일한값이있다. 예를들면 "adminserver" 라는서버가실행하는 JVM의이름은 'adminserver' 이다. parent-j2eetype MBean의상위 J2EE 타입으로각 MBean들에계층이규정되어있다. 예를들면 "JDBCDriver" 의상위 J2EE 타입은 'JDBCDataSource' 이다. jeustype JEUS JMX에서정의된 MBean들의타입이다. "JeusService" J2EE 타입만몇가지 jeustype을가질수있다. 다음값들중하나를설정한다. EJBEngine JMSDestinationResource JMSPersistenceStoreManager SecurityPolicy SessionContainer ThreadPool WebListener JMSClientResource JMSDurableSubscriberResource JMSServiceChannel SecurityService SessionContainerCentral ThreadPool_WEBC WebServices JMSConnectionFactoryResource JMSEngine SecurityDomain SecuritySubject SessionContainerP2P WebEngine istargetable 설정값은 blooean 타입으로사용자 AP(EJB, 서블릿, JSP) 가디플로이되어 istargetable 동작하는 MBean에서는반드시 true로설정되어야한다. JMXManager MBean 서비스를제공하는 JMXManager의이름이다. 일반적으로 JMXManager 항목의값은해당 JMXManager가속한서버이름과동일하다. 제 3 장 JMX 애플리케이션개발 21
Appendix A. JMX 모니터링예제 JEUS MBean 정보를모니터링하는 4가지중요한예제를설명한다. Servlet Thread Info 모니터링예제 ThreadPool Info 모니터링예제 JVM Info 모니터링예제 JDBC DataSource (DB Connection Pool) 모니터링예제 설명하는모든예제에서 MBean 서버정보를조회할때 RemoteMBeanServerFactory 를이용한다. MBean 서버를얻어오는다른방법에대한자세한내용은 제 3 장 JMX 애플리케이션개발 을참고한다. A.1. Servlet Thread Info 모니터링예제 Servlet Thread Info 모니터링예제는웹컨테이너의리스너의정보, 특히 Thread Pool과각 Thread에대한정보를모니터링한다. 이예제를통해모니터링하는정보는다음과같다. 현재할당된 Worker Thread의수 (current thread count) Thread Pool을유지하는최대 Thread의개수 (max thread count) Wait-Queue에적체된클라이언트의수 (wait queue count) 다음은 Servlet Thread Info 모니터링예제이다. package monitoring; import java.util.*; import javax.management.mbeanserverconnection; import javax.management.objectname; import javax.management.objectinstance; import javax.management.malformedobjectnameexception; import javax.management.mbeanserverinvocationhandler; import jeus.management.j2ee.servlet.*; public class ServletThreadInfo { public void showinfo(mbeanserverconnection mbeanserver, String targetname) throws Exception { Appendix A. JMX 모니터링예제 23
System.out.println("=== Servlet Thread Info ==="); // Get the object name of the servlet engine using JMX Standard API // Otherwise, the object name could be queried through MBeanServer. // Please see JEUS MBean API javadoc for more concrete name, key properties. ObjectName name = new ObjectName("JEUS:jeusType=WebEngine,J2EEServer=" + targetname + ",*"); Set names = mbeanserver.querymbeans(name, null); if (names == null names.size() == 0) { System.out.println("there is no servlet engine"); return; // Choose one servlet engine from the returned object names Iterator it = names.iterator(); ObjectName fullname = null; while (it.hasnext()) { fullname = ((ObjectInstance)it.next()).getObjectName(); break; assert fullname!= null; WebEngineMoMBean enginembean = (WebEngineMoMBean)MBeanServerInvocationHandler.newProxyInstance(mBeanServer, fullname, WebEngineMoMBean.class, false); // Get listeners from WebEngine String[] listeners = enginembean.getweblisteners(); if(listeners == null listeners.length == 0){ return; String webenginename = enginembean.getobjectname().getkeyproperty("name"); for(int i = 0; i < listeners.length; i++) { ObjectName listener = new ObjectName(listeners[i]); WebListenerMoMBean listenermbean= (WebListenerMoMBean) MBeanServerInvocationHandler.newProxyInstance (mbeanserver, listener, WebListenerMoMBean.class, false); String[] tpoolnames = listenermbean.getthreadpools(); // Get stats from thread pools if (tpoolnames!= null) { showthreadpoolstats(mbeanserver, webenginename, tpoolnames); 24 JEUS JMX 안내서
System.out.println(); private void showthreadpoolstats(mbeanserverconnection mbeanserver, String contextgroupname, String[] tpoolnames) throws MalformedObjectNameException { for (int k = 0; k < tpoolnames.length; k++) { ObjectName tpool = new ObjectName(tpoolNames[k]); System.out.println("[MBean] " + tpool); ThreadPoolMoMBean tpoolmbean = (ThreadPoolMoMBean)MBeanServerInvocationHandler.newProxyInstance( mbeanserver,tpool, ThreadPoolMoMBean.class, false); ThreadPoolStatsImpl stats = (ThreadPoolStatsImpl) tpoolmbean.getstats(); System.out.println("Listener: " + contextgroupname + "/" + tpool.getkeyproperty("name")); System.out.println("- current thread count : " + stats.getallthreadcount().getcount()); System.out.println("- max thread count : " + stats.getmaxthreadcount().getcount()); if (stats.getstatisticversion() == ThreadPoolStatsImpl.NIO_VERSION) { // pipeline System.out.println("- total connection count : " + stats.gettotalconnectioncount().getcount()); System.out.println("- max queue count : " + stats.getmaxqueuecount().getcount()); System.out.println("- current queue count : " + stats.getcurrentqueuecount().getcount()); System.out.println("- remain queue count : " + stats.getremainqueuecount().getcount()); System.out.println("- peak queue count : " + stats.getpeakqueuecount().getcount()); System.out.println("- total queue count : " + stats.gettotalqueuecount().getcount()); System.out.println("- difference queue 1m count : " + stats.getdifferencequeue1mcount().getcount()); System.out.println("- difference queue 5m count : " + stats.getdifferencequeue5mcount().getcount()); System.out.println("- difference queue 15m count : " + stats.getdifferencequeue15mcount().getcount()); System.out.println("- overflow queue count : " + stats.getoverflowcount().getcount()); System.out.println("- average queue time : " + stats.getqueuewaittimeaverage().getcount() + "(ms)"); Appendix A. JMX 모니터링예제 25
else { System.out.println("- wait queue count : " + stats.getwaitqueuecount().getcount()); System.out.println(); A.2. Thread Pool Info 모니터링예제 Thread Pool Info 모니터링예제는 JEUS 에서사용하는여러 Thread Pool의상태를모니터링한다. 이예제를통해모니터링하는정보는다음과같다. Thread Pool 크기 (size) 에대한정보 Thread Pool 통계 (stats) 정보 Thread 들의수행시간에대한통계 (execution time stats) 정보 Waiting-Queue 크기에대한통계 (size stats) 정보 다음은 Thread Info 모니터링예제이다. package monitoring; import java.util.hashtable; import java.util.iterator; import java.util.set; import javax.management.mbeanserverconnection; import javax.management.mbeanserverinvocationhandler; import javax.management.objectinstance; import javax.management.objectname; import javax.management.j2ee.statistics.timestatistic; import javax.management.j2ee.statistics.rangestatistic; import javax.naming.*; import jeus.jndi.jnsconstants; import jeus.management.jmxconstants; import jeus.management.remotembeanserverfactory; import jeus.management.j2ee.thread.threadpoolmbean; import jeus.management.j2ee.thread.stats.threadpoolstats; public class ThreadPoolInfo { 26 JEUS JMX 안내서
public void showinfo(mbeanserverconnection mbeanserver, String name) throws Exception { System.out.println("=== ThreadPool Info ==="); // Get the object names of the thread pools. // Please see JEUS MBean API javadoc for more concrete name, key // properties. ObjectName objectnames = new ObjectName("JEUS:jeusType=ThreadPool,*"); Set tpmbeans = mbeanserver.querymbeans(objectnames, null); for (Iterator i = tpmbeans.iterator(); i.hasnext();) { ObjectName mbeanname = ((ObjectInstance) i.next()).getobjectname(); // thread pool name System.out.println("[Thread-pool : " + mbeanname.getkeyproperty("name") + "]"); System.out.println("[MBean] " + mbeanname); ThreadPoolMBean pool = (ThreadPoolMBean)MBeanServerInvocationHandler.newProxyInstance( mbeanserver, mbeanname, ThreadPoolMBean.class, false); // ThreadPool Size System.out.println("-size : " + pool.getpoolsize()); System.out.println("-core size : " + pool.getcorepoolsize()); System.out.println("-largest Size : " + pool.getlargestpoolsize()); System.out.println("-max size : " + pool.getmaximumpoolsize()); System.out.println("-queue size : " + pool.getworkqueuesize()); // ThreadPool Stats ThreadPoolStats stats = (ThreadPoolStats) pool.getstats(); TimeStatistic executiontimestats = stats.getthreadexecutiontime(); TimeStatistic waitingtimestats = stats.getqueuewaitingtime(); System.out.println("# Thread Execution Time Stats"); System.out.println("--unit : " + executiontimestats.getunit()); System.out.println("--count : " + executiontimestats.getcount()); System.out.println("--min time : " + executiontimestats.getmintime()); System.out.println("--max time : " + executiontimestats.getmaxtime()); System.out.println("# Queue Waiting Time Stats"); System.out.println("--unit : " + waitingtimestats.getunit()); System.out.println("--count : " + waitingtimestats.getcount()); System.out.println("--min time : " + waitingtimestats.getmintime()); System.out.println("--max time : " + waitingtimestats.getmaxtime()); Appendix A. JMX 모니터링예제 27
A.3. JVM Info 모니터링예제 JVM Info 모니터링예제는 JEUS의노드또는컨테이너의 JVM에대해모니터링을한다. 이예제를통해모니터링하고자하는정보는다음과같다. JVM의 Total size 정보 JVM의 Heap size 정보 JVM의 Uptime 정보 다음은 JVM Info 모니터링예제이다. package monitoring; import java.util.iterator; import java.util.set; import javax.management.mbeanserverconnection; import javax.management.mbeanserverinvocationhandler; import javax.management.objectinstance; import javax.management.objectname; import javax.management.j2ee.statistics.boundedrangestatistic; import javax.management.j2ee.statistics.countstatistic; import javax.management.j2ee.statistics.rangestatistic; import jeus.management.j2ee.jvmmbean; import jeus.management.j2ee.statistics.jvmstatsimpl; public class JVMInfo { public void showinfo(mbeanserverconnection mbeanserver, String targetname) throws Exception { System.out.println("=== JVM Statistics ==="); ObjectName objectname = new ObjectName("JEUS:j2eeType=JVM,name=" + targetname + ",*"); Set jvmmbeans = mbeanserver.querymbeans(objectname, null); for (Iterator i = jvmmbeans.iterator(); i.hasnext();) { ObjectName objname = ((ObjectInstance) i.next()).getobjectname(); System.out.println("[MBean] " + objname); 28 JEUS JMX 안내서
// JVMMBean Stats JVMMBean jvm = (JVMMBean)MBeanServerInvocationHandler.newProxyInstance( mbeanserver, objname, JVMMBean.class, false); JVMStatsImpl jvmstatsimpl = (JVMStatsImpl) jvm.getstats(); RangeStatistic totalsize = jvmstatsimpl.gettotalsize(); BoundedRangeStatistic heapsize = jvmstatsimpl.getheapsize(); CountStatistic uptime = jvmstatsimpl.getuptime(); // JVM Total Size System.out.println("[Total Size]"); System.out.println("-unit : " + totalsize.getunit()); System.out.println("-current : " + totalsize.getcurrent()); System.out.println("-min size : " + totalsize.getlowwatermark()); System.out.println("-max size : " + totalsize.gethighwatermark()); // JVM Heap Size System.out.println("[Heap Size]"); System.out.println("-unit : " + heapsize.getunit()); System.out.println("-current : " + heapsize.getcurrent()); System.out.println("-min Size : " + heapsize.getlowwatermark()); System.out.println("-max Size : " + heapsize.gethighwatermark()); System.out.println("-lower bound : " + heapsize.getlowerbound()); System.out.println("-upper bound : " + heapsize.getupperbound()); // JVM UpTime System.out.println("[Up Time]"); System.out.println("-unit : " + uptime.getunit()); System.out.println("-count : " + uptime.getcount()); System.out.println("-start time : " + uptime.getstarttime()); A.4. JDBC DataSource(DB Connection Pool) 모니터링예제 JDBC DataSource(DB Connection Pool) 모니터링예제는서버에존재하는 DB Connection Pool을모니터링한다. 여기에는 javax.management.remote.jmxconnector을이용하여 MBean Connection을얻는예제도함께포함되어있다. 이예제의내용은다음과같다. 특정서버의 MBean 서버로연결한다. jeus.management.j2ee.jdbcresourcembean을조회해서현재생성된 Connection Pool들의정보를주기적으로파일에남긴다. Appendix A. JMX 모니터링예제 29
참고 Connection Pool 은기동할때생성되지않고실제서비스호출시점에생성된다. 다음은 DB Connection Pool 모니터링예제이다. package monitoring; import java.io.file; import java.io.fileoutputstream; import java.io.ioexception; import java.text.simpledateformat; import java.util.date; import java.util.hashtable; import java.util.iterator; import java.util.set; import javax.management.mbeanserverconnection; import javax.management.mbeanserverinvocationhandler; import javax.management.objectinstance; import javax.management.objectname; import javax.management.j2ee.statistics.jdbcconnectionpoolstats; import javax.management.j2ee.statistics.jdbcstats; import javax.management.remote.jmxconnector; import javax.naming.context; import javax.naming.initialcontext; import jeus.management.jmxconstants; import jeus.management.j2ee.jdbcresourcembean; public class DBStatsClient { public static void main(string[] args) { String servername = "changeplz"; //e.g. server1 Hashtable<String, Object> env = new Hashtable<String,Object>(); env.put(context.initial_context_factory, "jeus.jndi.jnscontextfactory"); env.put(context.url_pkg_prefixes, "jeus.jndi.jns.url"); env.put(context.provider_url, "localhost:9736"); MBeanServerConnection mbsc; try { InitialContext ctx = new InitialContext(env); JMXConnector connector = (JMXConnector)ctx.lookup( JMXConstants.JNDI_BINDING_PREFIX + servername); connector.connect(); mbsc = connector.getmbeanserverconnection(); catch (Exception e) { e.printstacktrace(); 30 JEUS JMX 안내서
return; System.out.println("mbean server connection successfully established"); Set mbeans; try { ObjectName dbstats = new ObjectName("JEUS:j2eeType=JDBCResource,*"); mbeans = mbsc.querymbeans(dbstats, null); catch (Exception e) { e.printstacktrace(); return; System.out.println("Successfully get JDBCResource"); File file = new File(serverName+".log"); FileOutputStream stream = null; try { stream = new FileOutputStream(file); catch (IOException e) { e.printstacktrace(); return; while(true) { for (Iterator iter = mbeans.iterator();iter.hasnext();) { ObjectName jdbcresourcembeanname = ((ObjectInstance) iter.next()).getobjectname(); JDBCResourceMBean jdbcresource = (JDBCResourceMBean) MBeanServerInvocationHandler.newProxyInstance( mbsc, jdbcresourcembeanname, JDBCResourceMBean.class, false); JDBCStats jdbcstats = (JDBCStats) jdbcresource.getstats(); SimpleDateFormat format = new SimpleDateFormat("[MM-dd]HH:mm:ss"); StringBuilder builder = new StringBuilder(); builder.append("[sta] "); for (JDBCConnectionPoolStats cpstats : jdbcstats.getconnectionpools()) { String output =format.format(new Date(System.currentTimeMillis())) + " name:[" +cpstats.getjdbcdatasource() + "]" + " total:[" +cpstats.getpoolsize().getcurrent() +"]" + " use:[" + (cpstats.getpoolsize().getcurrent() - cpstats.getfreepoolsize().getcurrent()) +"] "; builder.append(output); builder.append("\n"); try { stream.write(builder.tostring().getbytes()); catch (IOException e) { e.printstacktrace(); Appendix A. JMX 모니터링예제 31
return; try { Thread.sleep(10000); catch (InterruptedException e) { return; 32 JEUS JMX 안내서
색인 H HTML Adaptor Port, 7 J JDBC DataSource 모니터링예제, 29 JEUS JMX Manager, 7 JEUS 유틸리티, 12 JMX Connector, 7 JMXMP Connector, 8 JVM Info 모니터링예제, 28 M MBean 서버, 11 mbean-info, 2 MBeanServer, 11 MLet URL, 7, 8 R RemoteMBeanServerFactory, 11, 12 RMI Connector, 8 S Servlet Thread Info 모니터링예제, 23 SNMP Adaptor, 7 SNMP Adaptor 설정, 10 T ThreadPool Info 모니터링예제, 26 색인 33