J2SE(Java 2 Platform, Standard Edition) 5.0에서 크게 개선된 부분으로 모니터링과 관리 기능을 들 수 있으며, J2SE 5.0에 도입된 주요 특징에는 instrumented JVM(Java Virtual Machine)과 JVM을 모니터하고 감시하기 위한 java.lang.management API가 포함된다. 또한 API는 메모리 이용률, 스레드 상태, 클래스 로딩 활동, 가비지 컬렉션 전략 등을 비롯하여 다양한 JVM 관련 정보에 대한 로컬 및 원격 액세스를 가능하게 해준다. 이와 같이 강화된 통합 관리 및 모니터링 지원 기능은 J2SE 5.0 기반의 어떠한 관리 애플리케이션에서도 이용이 가능하다.
GlassFish와 MBeans
이런 기능을 활용하는 툴 중 하나가 바로 Java EE 5의 오픈 소스 애플리케이션 서버 구현인 GlassFish인데, GlassFish 애플리케이션 서버는 자체의 관리 인프라 내에서 J2SE 5.0 기반의 강화된 모니터링 및 관리 기능을 모두 활용한다. 또한 여기에는 플랫폼 MBean 서버를 이용하여 애플리케이션 서버 MBeans를 등록하는 기능도 포함되어 있다. Management Beans(일명 "MBeans")는 JMX(Java Management Extensions) 스펙에 준한 디자인 패턴을 따르는 자바 오브젝트로, 리소스를 공급하는 데 이용된다. 본 팁은 사용자가 JMX에 대한 기본 지식을 이미 가지고 있는 것으로 가정한다. JMX에 관한 개요를 보려면 테크팁 JMX 기술 이해하기를 참조할 것.
J2SE 5.0에 함께 도입된 플랫폼 MBean 서버는 JVM에 내장된 JMX 기반 에이전트로, 관리 애플리케이션이 MBeans에 액세스할 수 있게 해준다. 이 에이전트는 JVM에서 실행되는 모든 매니지드 컴포넌트에 의해 공유될 수 있다. GlassFish는 플랫폼 MBean 서버를 통해 시스템과 애플리케이션별로 MBeans에 대한 종합적이고 통합된 모니터링 및 관리 뷰를 제공할 수 있으며, J2SE 5.0 이전에 요구되었던 것처럼 자체 에이전트의 인스턴스를 생성하는 대신 이 내장 에이전트를 이용할 수 있다. 애플리케이션 서버 MBeans는 플랫폼 MBean 서버 리포지토리에 등록되기 때문에, 자바 모니터링 및 관리 콘솔(JConsole)과 같은 툴은 애플리케이션 서버 MBeans에 의해 제공되는 모든 리소스에 관한 정보를 디스플레이할 수 있다.
GlassFish와 커스텀 MBeans
사용자는 자체 커스텀 MBeans를 생성하여 등록함으로써 GlassFish의 관리 기능을 확장할 수 있다. 커스텀 MBeans는 모니터링 및 관리 기능의 동적 인젝션을 가능케 해줄 뿐 아니라 instrumented 커스텀 MBean 속성을 지속시켜 줌으로써 애플리케이션 서버를 재시작해야 할 경우에라도 활성 상태를 그대로 유지할 수 있게 한다. 커스텀 MBeans의 유용성을 엿볼 수 있는 한 가지 예가 바로 GlassFish의 자체 관리 프레임워크인데, 이는 규칙 기반의 이벤트 관리 시스템으로, 사용자는 커스텀 MBeans로 구현되는 커스텀 액션을 시스템 관리 규칙에 추가할 수 있다.
예제: 모니터링 및 관리 기능 확장하기
본 팁에서는 커스텀 MBeans를 이용하여 GlassFish의 모니터링 및 관리 기능을 확장하는 예제를 제시하고, 이 예제를 통해 웹 서비스로부터 정기적으로 획득하는 데이터를 처리하는 Java EE 애플리케이션을 확장해 보도록 한다. 또한 관리 확장을 위해 모니터 대상 이벤트, 그리고 그 이벤트에 대한 응답으로 애플리케이션이 취할 액션을 추가하도록 한다.
이벤트는 이메일 주소 목록을 업데이트하는 것이고, 액션은 업데이트된 이메일 주소 목록으로 이메일을 전송하는 것이다. 이 시나리오에서, 웹 서비스의 클라이언트이기도 한 커스텀 MBean은 웹 서비스를 폴링한 후에 이메일 주소 목록을 업데이트한다. 하지만, 이 예제에서는 단순화를 위해서 이메일 주소의 문자열이 커스텀 MBean의 속성으로 되어 있다. 사용자는 JConsole을 이용하여 직접 목록을 수정하고, 속성이 수정되면 리스닝 커스텀 MBean에 통지가 이루어진다. 그런 다음 리스닝 커스텀 MBean이 업데이트된 이메일 주소 목록(즉, 업데이트된 속성의 값)에 이메일을 전송하여 이벤트를 처리한다.
본 테크팁에는 예제 아카이브가 포함되어 있으며, 여기에는 예제를 위한 소스 코드, 그리고 컴파일된 클래스를 비롯하여 예제에서 사용되는 클래스를 위한 javadoc이 함께 포함되어 있다.
1단계: 셋업
초기 설정 작업부터 시작해보자. GlassFish를 아직 구하지 못했다면 GlassFish 다운로드 페이지에서 다운로드한 다음 아래의 환경변수를 설정한다.
GLASSFISH_HOME . GlassFish의 설치 장소(가령 C:\Sun\AppServer )을 표시해야 한다.
JAVA_HOME . 사용자 시스템에서의 JDK 5.0 위치를 표시해야 한다.
2단계: GlassFish 시작하기
다음 명령어를 입력하여 GlassFish를 시작한다. <GF_install_dir>/bin/asadmin start-domain domain1
이 때, <GF_install_dir> 은 GlassFish가 설치된 디렉토리를 나타낸다.
3단계: 예제 아키이브 다운로드하기
해당 팁의 예제 아카이브를 다운로드하여 압축을 푼다. jar xvf ttmar2006custmbean.jar
압축을 풀고 나면 META-INF , techtip 및 javadoc 디렉토리가 표시되어야 한다. techtip 디렉토리에는 예제용 소스 코드, 그리고 컴파일된 클래스가 포함되어 있다.
4단계: 커스텀 MBeans 생성하기
본 예제에서는 2개의 커스텀 MBeans--이벤트 소스용과 이벤트 청취용(이벤트 "싱크")--를 사용한다. 이 2개의 MBeans를 위한 소스 코드는 techtip/src 디렉토리에 들어 있다.
커스텀 MBean은 MBean 인터페이스와 MBean 구현 클래스를 필요로 하는데, 이벤트 소스용 커스텀 MBean 인터페이스는 EventSourceCustomMBean 이며, 그 구현 클래스는 EventSourceCustom 이다. 그리고 이벤트 싱크를 위한 커스텀 MBean 인터페이스는 EventSinkCustomMBean 이며, 그 구현 클래스는 EventSinkCustom 이다.
커스텀 MBeans를 위한 소스 파일을 생성한 후에는 파일들을 com.example.mbeans 패키지 구조에 컴파일할 수 있다(이는 옵션사항이며, 컴파일된 클래스는 예제 아카이브에 포함되어 있음). 파일을 컴파일하려면 다음을 입력한다. javac -d . EventSourceCustom.java EventSourceCustomMBean.java javac -d . EventSinkCustom.java EventSinkCustomMBean.java
EventSinkCustom 클래스를 컴파일할 때는 각 사용자의 클래스패스에 mail.jar 와 activation.jar 파일이 들어 있는지 확인해야 한다.
5단계: 커스텀 MBean 클래스 복사하기
com/example/mbeans 디렉토리와 그 내용을 MBean 클래스로더 디렉토리에 복사한다. MBean 클래스로더 디렉토리는 <domain>/applications/mbeans 이고, 이 때 <domain> 은 애플리케이션이 배치된 도메인을 나타낸다. 본 예제에서는 애플리케이션이 기본값 GlassFish 도메인인 domain1 에 배치된 것으로 가정한다. 따라서 com/example/mbeans 디렉토리와 그 내용을 <GF_install_dir>/glassfish/domains/domain1/applications/mbeans 에 복사한다. 그러면 /com/example/mbeans 디렉토리가 생성되고 커스텀 MBean 클래스와 인터페이스가 <GF_install_dir>/glassfish/domains/domain1/applications/mbeans에 복사된다.
6단계: 이벤트 소스 커스텀 MBean 배치하기
다음과 같이 이벤트 소스 커스텀 MBean, EventSourceCustom 을 배치한다(명령어는 한 행에 입력해야 한다). <GF_install_dir>/bin/asadmin create-mbean --user admin --passwordfile password.txt --port 4848 com.example.mbeans.EventSourceCustom
플랫폼 MBean 서버에 EventSourceCustom 이 등록된다.
다음 명령어를 이용하여 커스텀 MBean이 배치되었는지 확인할 수 있다(명령어는 한 행에 입력해야 한다). <GF_install_dir>/bin/asadmin list-mbeans --user admin --passwordfile password.txt
다음과 같은 내용이 표시되어야 한다. com.example.mbeans.EventSourceCustom user:impl-class-name=com.example.mbeans.EventSourceCustom, name=com.example.mbeans.EventSourceCustom Enabled Command list-mbeans executed successfully.
7단계: 이벤트 싱크 커스텀 MBean 배치하기
다음과 같이 이벤트 싱크 커스텀 MBean, EventSinkCustom 을 배치한다(명령어는 한 행에 입력해야 한다). <GF_install_dir>/bin/asadmin create-mbean --user admin --passwordfile password.txt --port 4848 --objectname "user:impl-class-name=com.example.mbeans.EventSinkCustom, name= custom-event-sink" --attributesHostName=<yourmailserver>:Id=<yourId>: Password=<yourpw> com.example.mbeans.EventSinkCustom
단, 명령어의 HostName , Id , Password 등의 파라미터에 유의할 것. 메일 서버에 접속하려면 이 파라미터들이 지정되어야 한다. 파라미터는 커스텀 MBean의 속성이다. <yourmailserver> 는 각자의 메일 서버 이름으로, <yourId> 는 각자의 ID로, <yourpw> 는 각자의 비밀번호로 대체한다.
앞에서 언급한 것처럼, instrumented 커스텀 MBean 속성을 지속시켜 줌으로써 애플리케이션 서버를 재시작해야 할 경우에라도 활성 상태를 그대로 유지할 수 있다. 따라서, 명령어의 파라미터를 지정하면 커스텀 MBean의 런타임 파라미터가 구성된다. 하지만 MBean이 생성된 후에는 서버가 재시작하더라도 파라미터는 기존의 상태를 지속하게 된다.
이번에도 다음 명령어를 이용하여 커스텀 MBean이 배치되었는지 확인할 수 있다(명령어는 한 행에 입력해야 한다). <GF_install_dir>/bin/asadmin list-mbeans --user admin --passwordfile password.txt
다음과 같은 내용이 표시되어야 한다. com.example.mbeans.EventSourceCustom user:impl-class-name=com.example.mbeans.EventSourceCustom, name=com.example.mbeans.EventSourceCustom Enabled com.example.mbeans.EventSinkCustom user:impl-class-name=com.example.mbeans.Event SinkCustom, name=custom-event-sink Enabled Command list-mbeans executed successfully.
8단계: 이메일 목록 업데이트하기
본 예제에서는 JConsole을 이용하여 이메일 주소의 문자열이 포함된 커스텀 MBean의 속성을 업데이트한다.
다음 명령어를 입력하여 JConsole을 시작한다. <JAVA_HOME>/bin/jconsole
JConsole를 시작하면 Local/Remote/Advanced JMX 접속 탭이 있는 접속 대화상자가 표시되어야 한다. Remote 탭을 클릭하고 해당 호스트(localhost), 포트(GlassFish의 JMX 접속 서버는 포트 8686에서 청취), 사용자 이름(admin), 비밀번호(adminadmin) 등의 값을 입력한다.
Remote 탭의 디스플레이에서 Connect 버튼을 클릭하면 RMI 커넥터를 통해 플랫폼 MBean 서버로의 접속이 이루어진다. 이어지는 Connection 창에서 MBeans 탭을 클릭하고, 창의 왼쪽 구획에 위치한 MBean 트리에서 사용자 브랜치를 확장한다. com.example.mbeans.EventSourceCustom 아래에 서버 엔트리가 표시될 때까지 사용자 브랜치의 하위 브랜치들을 계속 확장하고, 서버 엔트리를 클릭한다. 이제 창의 오른쪽 패널에 있는 Infor 탭에 MBean에 관한 정보가 표시되어야 한다.
창의 오른쪽 패널에 있는 Attributes 탭을 클릭한 다음 EmailRecipientsString 속성을 위한 값 필드에 각자의 이메일 주소를 입력한다.
EmailRecipientsString 속성을 변경하면 이벤트 소스 커스텀 MBean이 통지를 발송하는데, 이 때 AttributeChangeNotification 클래스에 의해 정의되는 통지를 청취하고 이 속성의 새 값을 가져온다. 다음은 이 작업과 관련한 EventSinkCustom 내의 코드이다. AttributeChangeNotification attrnotif = (AttributeChangeNotification) notif; String newEmailIdStr = (String)attrnotif.getNewValue();
이어서 이벤트 싱크 커스텀 MBean이 업데이트된 주소로 이메일을 전송한다.
9단계: 이메일 확인하기
리스닝 커스텀 MBean이 각자의 주소로 이메일을 전송했는지 확인하기 위해 우선 이메일을 살펴본다. 다음과 같은 메시지가 수신되어야 한다.
This message has been generated and sent as part of the Glassfish Techtip sample example execution
더 자세한 내용은 다음 사이트를 참조할 것.
저자 소개
Nandini Ektare는 썬 마이크로시스템즈의 썬 자바 시스템 애플리케이션 서버 개발 그룹 소속으로, JMX와 Java EE이 그녀의 주요 관심 분야이다.
Kedar Mhaswade는 썬 마이크로시스템즈의 스태프 엔지니어로, JSR 003: Java Management Extensions 전문가 그룹의 일원이다. 그의 주요 관심 분야로는 오픈소스 소프트웨어, JMX, Java EE 등이 있다. 맨위로 |