2009년 9월 28일 월요일
개발 과정에서 MIDlet을 로깅하고 모니터링하기는 쉽습니다. 콘솔에서 로그에 기록된 중요한 이벤트 주변의 몇 줄만 인쇄해보면, MIDlet 내에서 어떤 일이 일어나고 있는지 알 수 있습니다. NetBeans IDE와 같은 IDE(통합 개발 환경)를 이용하면 장치에서 디버깅 작업을 할 수 있으므로 훨씬 쉽게 파악할 수 있습니다. 하지만, MIDlet이 실제로는 클라이언트의 전화기에서 작동 중일 때는 이것이 아무런 소용이 없습니다.
킬러 MIDlet을 어떻게 모니터합니까? 뭔가 중요한 일이 발생하는 경우 이에 대한 알림 메시지를 받을 수 있습니까? 알림 메시지를 주의해서 읽으라는 SMS를 받을 수 있습니까? 물론, 그럴 수 있습니다. 여러 가지 API가 이를 가능하게 해주며, 이 테크팁에서는 이들 API를 단일 인터페이스로 결합하는 방법을 보여줍니다.
로깅 이벤트 시뮬레이션
실제 MIDlet에서 발생하는 다양한 이벤트를 시뮬레이트하기 위해, 필자는 랜덤 이벤트 생성기가 있는 간단한 MIDlet을 만들었습니다. 이 랜덤 이벤트 생성기는 MIDlet 내부의 활동을 시뮬레이트하고 정상적인 이벤트에 대해서는 아무런 동작도 하지 않습니다. 어떤 MIDlet에서든 경고(warning), 오류(error) 또는 중대한(critical) 이벤트보다는 정보 이벤트가 발생할 가능성이 더 크므로, 이 랜덤 MIDlet은 이런 이벤트의 생성에 대해 가변적인 스케일의 접근 방식을 취합니다. 이런 스케일은 다음 코드에서 구현됩니다.
// now try and simulate an event within this application
int rand = random.nextInt(19);
if (rand > 8) { // no event that needs logging if random no < 9
if (rand <= 13) { // info
form.append(midlet.getInfo());
midlet.doInfoLog("This is an information message.");
} else if (rand <= 15) { // warn
form.append(midlet.getWarn());
midlet.doWarnLog("This is a warning!");
} else if (rand <= 17) { // error
form.append(midlet.getError());
midlet.doErrorLog("Oh, no, an error occurred!");
} else { // critical
form.append(midlet.getCritical());
midlet.doCriticalLog("The sky is falling!");
}
}
MIDlet을 실행하여 활동을 시작하면 MIDlet이 1에서 15까지 클록을 통해 순환을 합니다. 이것은 MIDlet 내부에서 어떤 활동이 일어나고 있는지 사용자에게 보여주는 타이머입니다. 각각의 활동 주기 중, 난수가 생성됩니다. 이전 코드에 표시한 것처럼, 난수가 규정된 범위 내에 있는 경우에는 그에 상응하는 로깅 이벤트를 트리거합니다. 단순한 이벤트와 잘 발생하는 이벤트는 정보 메시지입니다. 가장 심각한 이벤트는 중대함(critical)으로 표시되는 이벤트이며, 이런 이벤트는 난수가 정확히 18인 경우에만 발생합니다.
로그 기록 대상과 장소
필자는 기술팀에서 뭔가 더 중대한 일이 일어나는 경우 실제 장치에서 도움을 받을 수 있는지를 감사하기 위한 방법으로, 정보 메시지는 기록만 된다고 가정했습니다. 이와 유사하게, 필자는 경고(warning) 메시지는 근처의 블루투스 장치에, 오류(error) 메시지는 인터넷 서버에 로그로 기록되고, 중대한(critical) 메시지는 SMS를 이용해 전송된다고 가정했습니다.
로깅 인터페이스 만들기
간편하게 하기 위해, MIDlet은 로깅 메시지의 심각성을 판단하여 그 가정을 바탕으로 로거를 만듭니다(이전 섹션에서 설명했음). 다음 코드에서는 이런 결정이 어떻게 구현되는지 보여줍니다.
private void createLoggers() {
infoLog = new RMSLogger();
warnLog = new BluetoothLogger();
errorLog = new InternetLogger();
criticalLog = new SMSLogger();
}
각 로거(logger)는 간단한 Logger 인터페이스를 구현한 것입니다. 이 인터페이스는 다음 코드에 표시됩니다.
public interface Logger {
public void doLog(String msg);
}
이 인터페이스는 doLog라는 단일 메서드를 이용해, 구현 시 따를 최소한의 계약을 정의합니다. 실제 구현에서는 로깅 호출을 어떻게 할 것인지를 생각해야 합니다.
로깅 구현 만들기
이는 실제 구현에서 수행할 사항을 이해하는 간단한 방법입니다. 예를 들어, 다음 코드는 RMSLogger가 수행할 작업을 보여줍니다.
package logger.impl;
import javax.microedition.rms.RecordStore;
import logger.Logger;
public class RMSLogger implements Logger {
private RecordStore rs;
public RMSLogger() {
try {
rs = RecordStore.openRecordStore("Log_Store", true);
} catch (Exception e) {
e.printStackTrace();
}
}
public void doLog(String msg) {
byte[] rec = msg.getBytes();
try {
rs.addRecord(rec, 0, rec.length);
} catch (Exception e) {
e.printStackTrace();
}
}
}
보시다시피, 생성자(constructor)가 레코드 저장소를 만들거나 여는 백그라운드 작업을 합니다. 그러면 doLog() 메서드가 레코드 저장소에 메시지를 작성하여 복잡한 작업을 합니다.
이와 유사하게, 다음은 InternetLogger 코드입니다.
package logger.impl;
import java.io.IOException;
import java.io.OutputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import logger.Logger;
public class InternetLogger implements Logger {
// set your destination URL here
private String destURL = "";
private HttpConnection conn;
public InternetLogger() {
try {
conn = (HttpConnection) Connector.open(destURL);
conn.setRequestMethod(HttpConnection.POST);
conn.setRequestProperty(
"Content-Type", "application/x-www-form-urlencoded");
} catch (Exception e) {
e.printStackTrace();
}
}
public void doLog(String msg) {
try {
// The destination URL must be set before doLog is called.
if(conn == null) {
System.err.println("DEST URL is not valid.");
return;
}
conn.setRequestProperty("Content-length", "" +
("msg=" + msg).getBytes().length);
OutputStream os = conn.openOutputStream();
os.write(("msg=" + msg).getBytes());
os.flush();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
이 코드는 단지 자리를 나타내는 표시자일 뿐입니다. 메시지 발신자의 식별 정보와 함께 메시지를 게시할 대상 URL에 알맞은 정보를 입력해야 합니다.
BluetoothLogger와 SMSLogger는 유사한 패턴을 따르며, 소스 코드에 이들에 대한 구현이 포함됩니다.
자료
- NetBeans IDE 프로젝트로서의 소스 코드
- Java ME GUI API 개요
- 무선 개발 자습서, I 부
- 무선 개발 자습서, II 부
- 원문 : Simple Strategy for Logging and Monitoring of MIDlets
http://blogs.sun.com/mobility_techtips/ ··· ging_and
"Java ME" 카테고리의 다른 글
- 블루투스와 GPS 사용: 1부 - 무선 직렬 포트 데이터 읽기 (댓글 0개 / 트랙백 0개) 2008/08/11
- 서비스 지향 아키텍처 및 자바 ME (댓글 7개 / 트랙백 0개) 2007/04/10
- destroyApp()는 당신의 친구 (댓글 0개 / 트랙백 0개) 2009/09/28
- 자바 ME 장치 매트릭스로 필터 사용 (댓글 0개 / 트랙백 0개) 2008/03/13
- Java ME를 사용한 블루레이 디스크 애플리케이션 개발 제 1 부: 나만의 애플리케... (댓글 0개 / 트랙백 0개) 2008/10/13
- 모바일 플랫폼의 비교: Java ME와 Adobe Flash Lite (댓글 0개 / 트랙백 1개) 2008/06/03
- NetBeans Mobility Pack 5.0 입문을 위한 속성 가이드 (댓글 5개 / 트랙백 0개) 2006/09/26
- 모바일 자바 플랫폼의 현재와 미래 (댓글 5개 / 트랙백 1개) 2006/07/26
- MIDlet의 로깅과 모니터링을 위한 간단한 전략 (댓글 0개 / 트랙백 0개) 2009/10/22
- 아프리카에서 전하는 소식: 이 지역에서 자바 ME 플랫폼에 주어진 과제와 기회 (댓글 0개 / 트랙백 0개) 2008/12/16
댓글을 달아 주세요