넷빈즈 IDE 6.7 에서 자바 어플리케이션에 JMX Instrumentation 추가하기
Written on 오후 10:45 by 강여사(J.Y.Kang)
아래 게시물의 선수지식 등을 사용하여 JMX 기술 및 Instrumentation 등에 대해 공부하시기 바랍니다. ^^ 이번 게시물에서는 제목대로 자바 어플리케이션에다 사용자 정의 MBean 및 MBean 인터페이스, 속성, 오퍼레이션, 통지 등에 대해 생성, 구현, 설정 하고 테스트하는 방법에 대해 알아 보고자 합니다.
우선 작업환경은 다음과 같습니다.
넷빈즈 IDE 6.5/ 6.7 이상
JDK 5 나 6 이상
JMX 플러그인 - 설치 (넷빈즈 플러그인으로 설치 진행)
JConsole 플러그인 - 설치 (넷빈즈 플러그인으로 설치 진행)
-------------------------------------------------------
플러그인 설치부터 진행합니다.
도구 - 플러그인 클릭
범주를 클릭해서 Management 를 정렬하면 JConsole과 JMX 가 있습니다. 체크하고 아래쪽의 설치 버튼을 눌러 설치를 진행합니다.
이제 작업에 사용될 자바 어플리케이션을 만듭니다. (샘플 프로젝트 사용)
file - new project
프로젝트의 Samples 카테고리의 Java - Anagram Game 이 있습니다. 선택하고 -다음
프로젝트 명은 그대로, 경로도 적당히 , 마침
프로젝트의 소스/포맷 레벨 조정 및 확인 등을 위해 프로젝트에서 마우스 오른쪽을 클릭 맨 아래 properties 클릭
Sources 카테고리를 누르면 JDK 포맷이 나타납니다(기본적으로 1.4 로 되어 있을 듯) 그럼 이를 JDK 5 이상으로(5나 6) 변경합니다. (이는 추후 JMX 기타 관련 작업을 위해서입니다 ) - OK
프로젝트에서 오른쪽 마우스를 눌러 새 파일을 만듭니다. 오른쪽 클릭 - new - other 선택
파일 유형에 JMX 카테고리를 선택하면 관련 파일 유형이 나오는데 이 중 Standard MBean 을 선택합니다. 아래 설명에도 있듯이 JMX 표준 MBean 을 생성하고자 합니다. - 다음
이름은 AnagramStats
패키지는 com.toy.anagrams.mbeans
설명(description)에는Monitoring and Management of the Anagrams Game
마침
이제 이 MBean의 속성(attributes), 오퍼레이션(Operations), 통지(Notification) 등을 추가할 예정입니다.
만들어진 AnagramStats.java 에서 오른쪽 마우스를 클릭 (아니면 편집기 창에서 오른쪽 마우스 클릭) 하면 JMX 메뉴가 있습니다. 다시 이안에 "Add MBean attibutes..." 메뉴가 있습니다. 클릭
팝업창에 다음의 내용을 반영합니다(각 텍스트필드 작성후 엔터키로 반영)
일단 Add Attribute 버튼을 누르고 나타난 예제를 다음으로 변경합니다.
Attribute Name : LastThinkingTime
Type: int
Access: ReadOnly (드랍다운메뉴 선택)
Description: Elapsed time to solve last anagram
다시 Add Attribute 버튼을 누르고 다음 내용 추가
Attribute Name: NumSolvedAnagrams
Type: int
Access: ReadOnly
Description: Number of solved anagrams
OK
OK 를 누르면 이렇게 해서 만들어진 소스 코드를 볼 수 있습니다. 다시 나머지 3개의 변수 추가를 위해 같은 작업을 합니다.
변수 이름 유형 액세스 설명
MinThinkingTime int ReadOnly Minimum elapsed time to solve an anagram
MaxThinkingTime int ReadOnly Maximum elapsed time to solve an anagram
CurrentAnagram String ReadOnly Current anagram to solve
OK
이번에는 MBean 오퍼레이션을 추가하도록 하겠습니다.
역시 AnagramStats.java 에서 마우스 오른쪽클릭- JMX - Add Mbean Operation... 선택
add operation 버튼을 클릭하여 샘플예시를 다음으로 변경합니다.
Operation Name: resetAll
Return Type: void
Parameters: (leave empty)
Exceptions: (leave empty)
Description: Reset MBean state
OK
이번에는 이벤트 발생시 통지를 위한 Notification 인터페이스 구현 작업을 하겠습니다.
AnagramsStats.java 에서 다시 마우스 오른쪽 클릭 - JMX - "Implement NotificationEmitter interface..." 선택
위의 2개 모두를 선택하고 (자동생성)
아래 통지에는 다음과 같이 작업합니다.
Notification Class :(드랍다운메뉴에서 선택) javax.management.AttributeChangeNotification
Notification Type: (자동선택됨) ATTRIBUTE_CHANGE)
Description: Anagram is Solved
OK
만들어진 코드 확인
이번에는 오퍼레이션의 내용을 채우겠습니다. 작성된 모두를 초기화하도록 다음 코드를 resetAll() 안에 붙여 넣습니다. (굵은 글씨 참고)
=========================================
public void resetAll() {
minThinkingTime = 0;
maxThinkingTime = 0;
lastThinkingTime = 0;
numSolvedAnagrams = 0;
}
=========================================
이제 몇몇 구현 코드를 추가합니다. 구현 코드 내용은 사용자가 문제를 풀기위해 얼마나 걸렸는지 thinking 시간을 계산하고, 푼 문제 갯수를 증가시키고, 문제를 풀때 통지를 만들어 보내는 등에 대한 내용입니다. 다음 코드를 AnagramStats.java 에 붙여넣습니다.
===============================================================================
/*
* Methods exposed to Anagrams application to feed management with data.
*/
//Stores the time at which a new anagram is proposed to the user.
private long startTime;
/**
* A new Anagram is proposed to the user: store current time.
*/
public void startThinking() {
startTime = System.currentTimeMillis();
}
/**
* An Anagram has been resolved.
*/
public void stopThinking() {
//Update the number of resolved anagrams
numSolvedAnagrams++;
// Compute last, min and max thinking times
lastThinkingTime = (int) (System.currentTimeMillis() - startTime) / 1000 ;
minThinkingTime = (lastThinkingTime < minThinkingTime minThinkingTime == 0) ?
lastThinkingTime :
minThinkingTime;
maxThinkingTime = (lastThinkingTime > maxThinkingTime) ?
lastThinkingTime :
maxThinkingTime;
//Create a JMX Notification
Notification notification = new Notification(AttributeChangeNotification.ATTRIBUTE_CHANGE,
this,
getNextSeqNumber(),
"Anagram solved: " + currentAnagram);
// Send a JMX notification.
broadcaster.sendNotification(notification);
}
/**
* Set latest anagram which has been computed by the Anagram application
*/
public void setCurrentAnagram(String currentAnagram) {
this.currentAnagram = currentAnagram;
}
===============================================================================
이제 운영과 어플리케이션을 연결하기 위해 GUI 로 쓰인 Anagrams.java 를 엽니다.(com.toy.anagrams.ui 안에 있습니다)
여기에 다음 코드를 추가합니다.
------------------------------------------------------------------------------
/**
* JMX initialization:
* Create and register Anagrams MBean in Platform MBeanServer.
* Initialize thinking time and current anagram.
*/
private void initManagement() throws Exception {
}
------------------------------------------------------------------------------
그런 다음 이 메소드를 생성자의 마지막에 호출합니다. (그림 참고)
==================================================================
//JMX Management initialization
initManagement();
==================================================================
이 작업을 하면 2군데 Exception 관련 오류가 납니다.
왼쪽의 빨강전구표시를 눌러 add throws Exception 으로 둘다 처리합니다.
그럼 이제 initManagement() 메소드 안에 MBean 등록 코드를 추가하기 위해 다음과 같이 마법사를 사용합니다. 일단 initManagement() 메소드 안에서 오른쪽 마우스를 클릭하고 JMX - "Generate MBean Registration..." 를 선택합니다.
그럼 팝업창이 뜹니다. 여기서
Register Existing MBean 을 선택하고 브라우저 버튼을 눌러 AnagramStats 를 선택합니다.
다음 내용이 자동 작업됩니다. (기본대로)
OK
생성된 코드에서 다음 내용을 추가합니다. 클래스 아래에 다음 변수를 추가
=========================================================================
// Reference to the AnagramsStats MBean
private AnagramsStats mbean;
=========================================================================
그런 다음 아래 메소드 안에 생성과 생성된 인스턴스 사용을 위해 소스를 추가, 수정합니다. (굵은 글씨 참고)
=============================================================================
private void initManagement() throws Exception {
try { // Register MBean in Platform MBeanServer
mbean = new AnagramsStats();
ManagementFactory.getPlatformMBeanServer().
registerMBean(mbean, new ObjectName("com.toy.anagrams.mbeans:type=AnagramsStats"));
} catch (JMException ex) {
ex.printStackTrace();
}
=============================================================================
그런 다음 메소드 아래에 다음 내용 추가
=============================================================================
// When the Anagrams game is first displayed, a word is proposed to the user.
// We must start time computing and set the current anagram
mbean.startThinking();
mbean.setCurrentAnagram(wordLibrary.getScrambledWord(wordIdx));
=============================================================================
그런 다음 nextTrialActionPerformed() 메소드에 다음 내용을 추가합니다.
========================================================================
//Update management statistics and values
try {
mbean.setCurrentAnagram(wordLibrary.getScrambledWord(wordIdx));
mbean.startThinking();
} catch (Exception e) {
e.printStackTrace();
}
========================================================================
이번에는 guessedWordActionPerformed() 메소드의 if 문 안에 다음 내용을 추가합니다. (그림 참조)
==============================================================================
//Update management stats
try {
mbean.stopThinking();
} catch(Exception e) {
e.printStackTrace();
}
==============================================================================
모두를 저장하고 이제 JConsole과 함께 프로그램을 실행해보도록 하겠습니다.
위의 메뉴바에 보면(도움말 아래) "Run Main Project with Monitoring and Management..." 버튼이 있습니다. 이 아이콘을 누릅니다.
build.xml 업데이트에 대한 대화상자가 나타납니다. OK
차례로 어플리케이션 GUI 와 JConsole 이 나타납니다.
JConsole 에 MBean 탭을 누르고, 왼쪽 트리에서 com.toy.anagram.mbeans 를 누르면 작성한 내용이 보입니다. (AnagramsStats)
속성 (attributes) / 오퍼레이션 (operations) / 통지 (notification)에 대해 확인
그럼 통지 (Notification)노드를 선택하고 오른쪽에 보면 Subscribe 버튼이 있습니다. 이벤트 발생시(문제를 풀었을 때마다) 통지를 받겠다는 이야기입니다.
GUI 로 돌아가 문제를 풉니다. (abstraction, ambiguous, arithmetic, backslash, ...)
문제를 풀때마다 통지가 수신됩니다.
Attributes(속성) 노드를 눌러 업데이트된 내용을 살펴볼 수 있습니다.
점검이 다 끝나면 저장된 내용을 삭제하는 오퍼레이션에 대해 호출해봅니다.
Operations - resetAll 버튼 클릭
메소드가 정상적으로 호출되었다는 팝업창이 뜨면서 해당 값들이 초기화되었음을 알 수 있습니다.
이상이 자바 어플리케이션에 JMX 조정을 사용해본 예제였습니다.
다음 게시물은 JMX Manager 어플리케이션에 대해 알아 보겠습니다.
수고하셨습니다. ^^