넷빈 6.7에서 JMX 매니저 개발 및 원격 JMX Agent 연결하기

0

Written on 오전 4:35 by 강여사(J.Y.Kang)

이번 넷빈 JMX 모듈에 있는 JMX Manager 를 개발하고 원격 JMX Manager를 연결하는 방법등에 대해 다뤄보겠습니다.

작업 환경:
넷빈즈 6.5/6.7 이상
JDK 5 나 6
JMX 플러그인 - 설치
JConsole 플러그인 - 설치
(두 플러그인의 설치 방법은 이미 전 게시물에 언급했기때문에 자세한 내용은 생략하겠습니다. 도구 - 플러그인 - 해당 2개의 모듈 설치)

매니저먼트 샘플 Anagram 프로젝트를 생성합니다.
File - new project


Samples - JMX - Anagram Game Managed with JMX 선택 - 다음
이름 그대로 (기본) 경로 적당히 - 마침

원격 관리를 위한 원격 JMX Agent 를 위해서 프로젝트 소스 포맷은 반드시 1.5 이상이어야 합니다.
프로젝트에서 오른쪽 마우스 클릭 - Properties 클릭 Sources 카테고리 선택 후 오른쪽 아래 Source/Binary Format JDK는 5 이상으로 맞춥니다.
OK
카테고리에서 Monitoring and Management 를 선택하고 오른쪽의 Enable RMI Remote Access 를 체크합니다.
원격 포트로 기본 포트인 1099를 그대로 선택합니다.
OK
"Run Main Project with Monitoring and Management 클릭
프로그램GUI가 제시되고 ,
이어 JConsole 이 표시됩니다.
이번에는 Manager Project 를 만들도록 하겠습니다.

File - new project

Java - Java Application 선택

프로젝트 이름: JMXAnagramManager
경로는 적당히
메인 프로젝트로 설정 (Set as Main Project)는 체크되고
create main class 는 해제합니다.
마침
프로젝트에서 마우스 오른쪽 클릭 - new - other
JMX - JMX Manager 선택 - 다음

클래스 이름: AnagramsManager
패키지 이름: com.toy.anagrams.manager
아래 3개모두 선택(기본)
다음
JMX Agent URL 의 Edit 버튼을 클릭하면 다음 그림과 같이 팝업창이 뜹니다.
프로토콜로 RMI JVM Agent 선택 , 호스트 localhost , 1099 , URL 기본 대로
OK

다음 JMX Agent URL 텍스트박스가 업데이트 됩니다.
인증 연결 체크 - 인증을 위한 샘플 코드 자동 생성
마침

AnagramsManager.java 파일에서 주석이 되어 있는 부분을 주석을 제거해서 풉니다.(참고)
======================================================================
public static void main(String[] args) throws Exception {

//Manager instantiation and connection to the remote agent
AnagramsManager manager = AnagramsManager.getDefault();

// SAMPLE MBEAN NAME DISCOVERY. Uncomment following code:
Set resultSet =
manager.getMBeanServerConnection().queryNames(null, null);
for(Iterator i = resultSet.iterator(); i.hasNext();) {
System.out.println("MBean name: " + i.next());
}

// Close connection
manager.close();
System.out.println("Connection closed.");
}
======================================================================
import 문제 해결을 위해 fix import
java.util.Set 과 java.util.Iterator 클래스 선택

메인 프로젝트 실행
위의 메뉴바에 run- run main project

매니저가 수행되며 원격 agent 연결, output 창에 MBean 이름 출력하고 커넥션을 닫게 됩니다.
====================================================================== init:
deps-jar:
compile:
run:
MBean name: java.lang:type=MemoryManager,name=CodeCacheManager
MBean name: java.lang:type=Compilation
MBean name: java.lang:type=MemoryPool,name=PS Perm Gen
MBean name: com.sun.management:type=HotSpotDiagnostic
MBean name: java.lang:type=Runtime
MBean name: com.toy.anagrams.mbeans:type=AnagramsStats
MBean name: java.lang:type=ClassLoading
MBean name: java.lang:type=Threading
MBean name: java.lang:type=MemoryPool,name=PS Survivor Space
MBean name: java.util.logging:type=Logging
MBean name: java.lang:type=OperatingSystem
MBean name: java.lang:type=Memory
MBean name: java.lang:type=MemoryPool,name=Code Cache
MBean name: java.lang:type=GarbageCollector,name=PS Scavenge
MBean name: java.lang:type=MemoryPool,name=PS Eden Space
MBean name: JMImplementation:type=MBeanServerDelegate
MBean name: java.lang:type=GarbageCollector,name=PS MarkSweep
MBean name: java.lang:type=MemoryPool,name=PS Old Gen
Connection closed.
BUILD SUCCESSFUL (total time: 1 second)
======================================================================
수고하셨습니다. *^^*



넷빈즈 IDE 6.7 에서 자바 어플리케이션에 JMX Instrumentation 추가하기

0

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 어플리케이션에 대해 알아 보겠습니다.

수고하셨습니다. ^^