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("=================================================");
}
}
|
댓글 없음:
댓글 쓰기