2015년 10월 12일 월요일

Quartz를 이용한 Schduler를 JMX를 이용하여 제어하기(1) - JMX Agent 작성

Quartz를 이용한 Schduler를 JMX를 이용하여 제어하기(1)

이번 강좌의 구조는 Loader, DT라는 자바 애플리케이션 그리고 각종 Batch Program을 지정된 시간마다 주기적으로 실행 하기 위해 Timer API 이상의 훨씬 뛰어난 장점들을 가진 오픈 소스 작업 스케줄링 시스템인 Quartz를 이용 했으며 이 스케줄러를 원격에서 제어하기 위해 JMX(Java Management Extension)를 이용했습니다.

전체적인 구조는 JMX MBean이 있고 이 MBean이 제어하는 것은 스케쥴러인데 이스케쥴러는 LoaderJobScheduler, DTJobScheduler, BatchJobScheduler 라는 Quartz를 이용한 스케쥴러입니다. 하는 역할을 보면 디렉토리에 파일이 있는지 체크하는 Loader를 주기적으로 실행하기 위한 LoaderJobScheduler, 특정 디렉토리를 주기적으로 검색하여 파일을 원격으로 전송하기 위한 DTJobScheduler, 각종 배치프로그램을 주기적으로 실행하는 BatchJobScheduler등 입니다.

그리고 이 Scheduler를 제어(특정한 작업을 시작, 종료)하기 위한 JMX 인터페이스를 제공하는 MBean(ProcessControl, ProcessControlMBean, BatchControl, BatchControlMBean)들이 있구요…. 이러한 MBean을 웹에서 제어하여 해당 Process를 살리고 죽이고 할 수 있습니다. processControl이 LoaderJobScheduler, DtJobScheduler를 다루며 BatchControl이라는 MBean이 BatchJobSchduler를 제어 합니다.

우선 첫 번째 내용으로 JMX Agent를 만들어 볼까요? 사실 저도 잘 모르지만 다른분이 해놓으신 것 참고해서 만든 겁니다. 잘못된 내용이 있다면 답 글 부탁 드립니다.

이 Agent에서는 JMX Service를 정의하며 Scheduler와 DT Scheduler를 Control 하기 위한 MBean(ProcessControl, BatchControl)을 등록하여 추후 client program에서 이 MBean을 통해 Loader, DT를 스케줄링 하는 Scheduler를 제어할 수 있게 합니다.

참고로 JMX를 사용하기 위해서는 j2ee1.4 or j2se5.0을 설치 받으시면 됩니다.

1. JMX Service Agent(JmxAgent.java)




package oracle.jmx.agent;

import java.rmi.registry.LocateRegistry;
import java.util.HashMap;
import java.util.Map;

import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
import javax.management.remote.rmi.RMIConnectorServer;

import oracle.jmx.mbeans.ProcessControl;
import oracle.jmx.mbeans.BatchControl;
import oracle.jmx.util.ExceptionUtil;
import com.sun.jdmk.comm.HtmlAdaptorServer;

public class JmxAgent {

private MBeanServer server = null;

public JmxAgent() {
server = MBeanServerFactory.createMBeanServer("JmxAgent");
//startHTMLAdapter();
startAgent();
}

private void startAgent() {

JMXServiceURL serviceUrl = null;
ObjectName connectorName = null;
ObjectName processControlMBeanName = null;
ObjectName batchControlMBeanName = null;

try {

LocateRegistry.createRegistry(7777);
serviceUrl = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:7777/server");
Map environment = new HashMap();
environment.put(RMIConnectorServer.JNDI_REBIND_ATTRIBUTE,"true");
connectorName = new ObjectName("JmxAgent:name=RmiConnector");

//Process 관리를 위한 MBean Name 정의
processControlMBeanName = new ObjectName("JmxAgent:name=processControl");

//Batch Program 관리를 위한 MBean Name 정의
batchControlMBeanName = new ObjectName("JmxAgent:name=batchControl");

JMXConnectorServer connector = JMXConnectorServerFactory
.newJMXConnectorServer(serviceUrl, environment, server);

//Agent에 MBean 등록
server.registerMBean(new ProcessControl(), processControlMBeanName);
//server.registerMBean(new BatchControl(), batchControlMBeanName);

server.registerMBean(connector, connectorName);
connector.start();
} catch (Exception e) {
ExceptionUtil.printException(e);
}
}

protected void startHTMLAdapter() {
HtmlAdaptorServer adapter = new HtmlAdaptorServer();
ObjectName processControlMBeanName = null;
ObjectName batchControlMBeanName = null;
ObjectName adapterName = null;
try {
adapter.setPort(9092);
adapterName = new ObjectName("JmxAgent:name=html,port=9092");
processControlMBeanName = new ObjectName("JmxAgent:name=processControl");
batchControlMBeanName = new ObjectName("JmxAgent:name=batchControl");
server.registerMBean(new ProcessControl(), processControlMBeanName);
//server.registerMBean(new BatchControl(), batchControlMBeanName);
server.registerMBean(adapter, adapterName);
adapter.start();
} catch (Exception e) {
ExceptionUtil.printException(e);
}
}

public static void main(String[] args) {
new JmxAgent();
System.out.println("=================================================");
System.out.println("= =");
System.out.println("= =");
System.out.println("= JMX AGENT START!!! =");
System.out.println("= =");
System.out.println("= =");
System.out.println("=================================================");
System.out.println("= Agent is Ready for Service... =");
System.out.println("=================================================");
}

}

댓글 없음:

댓글 쓰기