2015년 10월 12일 월요일

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


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

이번 강좌에서는 JMX의 핵심인 MBean을 만들어 보겠습니다.

JMX 기술을 사용하면 MBean(Managed Bean)으로 알려진 하나 이상의 사용자 JavaBean 오브젝트를 통해 (리소스를 호출하는) 한 기계 안의 애플리케이션, 디바이스, 또는 서비스를 원격으로 제어할 수 있습니다.

MBean은 Process 제어(중지, 시작)를 위한 ProcessControlMBean과 각종 Batch Program을 시작하거나 종료 시키는 BatchControlMBean 두개를 제작해 보도록 하겠씁니다. 흔히 만드시는 자바빈과 유사하니 크게 적정하지 마시구요^^ MBean으로 끝나는 인터페이스와  MBean이 없는 이를 구현한 파일로 구성 됩니다.

아래 예제는 Loader(파일을 주기적으로 읽는 일을 하는 놈)와 DT(만들어진 파일을 주기적으로 돌면서 전송하는 역할을 하는 놈)를 제어하는 processControl이라는 것과 각종 Batch Program을 주기적으로 실행하는 batchControl이라는 두 종류의 MBean에 대한 예이니 참고 하세요~

==============================================================
1.        ProcessControlMBean.java
==============================================================

/*--------------------------------------------------------------------------
  * 시스템명 :
  * 작 성 일  : 2006.2.4
  * 작 성 자  : 이종철(jclee)
  * 수 정 일  :
  * 수 정 자  :
  * 파 일 명  : ProcessControlMBean.java
  * 버    전  : 0.1
  * 개    요  : LO/DT Scehduler를 Management위한 JMX용 MBean Interface
  *          ProcessControl에서 아래의 추상 메소드를 구현함
  * 이    력  : 2006.2.4 신규 생성 
  --------------------------------------------------------------------------*/
 
package oraclejava.jmx.mbeans;

public interface ProcessControlMBean {
        String startScheduler(String gbn);
        String stopScheduler(String gbn);
        String start(String gbn, String dtName);
        String startAll(String gbn);       
        String stop(String gbn, String dtName, String mode);       
        String stopAll(String gbn, String mode);
        java.util.List  getRunningJob(String gbn);
}


===============================================================
2.        ProcessControl.java
===============================================================

/*--------------------------------------------------------------------------
  * 시스템명 :
  * 작 성 일  : 2006.2.4
  * 작 성 자  : 이종철(jclee)
  * 수 정 일  :
  * 수 정 자  :
  * 파 일 명  : ProcessControlControl.java
  * 버    전  : 0.1
  * 개    요  : JMX Management Bean에서 정의한 Interface를 구현
  *          LoaderJobScheduler, DtJobScheduler를 통해 DT를 start, stop 시키는 기능
  *          LoaderJobScheduler, DtJobScheduler는 Quartz Framework을 이용하여 구현한
  * 이    력  : 2006.2.4  신규 생성 
  --------------------------------------------------------------------------*/

package oraclejava.jmx.mbeans;

import oraclejava.processmgr.DtJobScheduler;
import oraclejava.processmgr.LoaderJobScheduler;
import oraclejava.jmx.util.JmxConstants;
import oraclejava.jmx.util.ExceptionUtil;
import java.util.List;
import oraclejava.jmx.util.MBeanUtil;


public class ProcessControl implements ProcessControlMBean {
       
        /*
        * LO/DT용 Scheduler를 시작
        */
        public String startScheduler(String gbn){
                //return JmxConstants.DT_SCHEDULER_START_OK;
               
                System.out.println("GBN => " + gbn);
               
                try {       
                        //DT용
                        if (gbn.equals("DT")) {
                                if (DtJobScheduler.startScheduler()) {                               
                                        return JmxConstants.DT_SCHEDULER_START_OK;
                                }
                                else {                               
                                        return JmxConstants.DT_SCHEDULER_START_FAIL;
                                }               
                        }
                        //LOADER용
                        else {
                                if (LoaderJobScheduler.startScheduler()) {                               
                                        return JmxConstants.LOADER_SCHEDULER_START_OK;
                                }
                                else {                               
                                        return JmxConstants.LOADER_SCHEDULER_START_FAIL;
                                }       
                        }
                }
                catch(Exception e) {
                        e.printStackTrace();
                        ExceptionUtil.printException(e);
                        return JmxConstants.DT_SCHEDULER_START_FAIL;
                }                       
        }
       
        /*
        * LO/DT용 Scheduler를 종료, Abort
        */
        public String stopScheduler(String gbn) {
                //DT용
                if (gbn.equals("DT")) {
                if (DtJobScheduler.shutdownScheduler("A")) {                       
                                return JmxConstants.DT_SCHEDULER_STOP_OK;
                        }
                        else {
                                return JmxConstants.DT_SCHEDULER_STOP_FAIL;
                        }
                }
                //LOADER용
                else {
                        if (LoaderJobScheduler.shutdownScheduler("A")) {                       
                                return JmxConstants.LOADER_SCHEDULER_STOP_OK;
                        }
                        else {
                                return JmxConstants.LOADER_SCHEDULER_STOP_FAIL;
                        }
                }
        }
       

        /**
        * 인자로 입력되는 LO/DT를 시작
        */
        public String start(String gbn, String name) {       
                       
                //DT용
                if (gbn.equals("DT")) {
                        if (DtJobScheduler.startJob(name)) {                               
                                return JmxConstants.DT_START_OK;
                        }
                        else {
                                return JmxConstants.DT_START_FAIL;
                        }       
                }
                //LOADER용
                else {
            if (LoaderJobScheduler.startJob(name)) {                               
                                return JmxConstants.LOADER_START_OK;
                        }
                        else {
                                return JmxConstants.LOADER_START_FAIL;
                        }
                }
        }
       
        /**
        * 등록된 모든 LO/DT를 시작
        */
        public String startAll(String gbn) {               
        //DT용
                if (gbn.equals("DT")) {
                        if (DtJobScheduler.startJob("A")) {
                                return JmxConstants.DT_START_OK;
                        }
                        else {
                                return JmxConstants.DT_START_FAIL;
                        }
                }
                //LOADER용
                else {
                       
                        if (LoaderJobScheduler.startJob("A")) {
                                return JmxConstants.LOADER_START_OK;
                        }
                        else {
                                return JmxConstants.LOADER_START_FAIL;
                        }                       
                }
        }
       
        /**
        * 인자로 입력되는 LO/DT를 정상  종료
        */
        public String stop(String gbn, String name, String mode) {
               
        //DT용
                if (gbn.equals("DT")) {
                        if (DtJobScheduler.stopJob(name, mode)) {
                                return JmxConstants.DT_STOP_OK;
                        }
                        else {
                                return JmxConstants.DT_STOP_FAIL;
                        }
                }
                //LOADER용
                else {
                        if (LoaderJobScheduler.stopJob(name, mode)) {
                                return JmxConstants.LOADER_STOP_OK;
                        }
                        else {
                                return JmxConstants.LOADER_STOP_FAIL;
                        }
                }
        }
               
       
        /**
        * 모든 LO/DT를 즉시  종료
        * mode는 "A" 또는 "N"
        */
        public String stopAll(String gbn, String mode) {
        //DT용
                if (gbn.equals("DT")) {
                        if(DtJobScheduler.shutdownScheduler(mode)) {
                                return JmxConstants.DT_STOP_OK;
                        }
                        else {
                                return JmxConstants.DT_STOP_FAIL;
                        }
                }
                else {
                        if(LoaderJobScheduler.shutdownScheduler(mode)) {
                                return JmxConstants.LOADER_STOP_OK;
                        }
                        else {
                                return JmxConstants.LOADER_STOP_FAIL;
                        }
                }
        }
       
        /**
        * 현재  LO/DT 목록을 Return, 기종 여부 표시
        *
        */
        public List getRunningJob(String gbn) {
                //LOADER/DT 전체를 하나에 담아 Return
                if (gbn.equals("A")) {
                        return MBeanUtil.joinList(DtJobScheduler.getRunningJob(), LoaderJobScheduler.getRunningJob());                           
                }
                //DT or LOADER별로 작업 목록을 return
                else {
                //DT용
                        if (gbn.equals("DT")) {
                            return DtJobScheduler.getRunningJob();       
                        }
                        //LOADER용(LO)
                        else {
                                return LoaderJobScheduler.getRunningJob();       
                        }
                }
        }
       
}

---------------------------------
3.        JmxConstants.java
---------------------------------
 

/*--------------------------------------------------------------------------
  * 시스템명 : SK Telink Mediation System
  * 작 성 일  : 2006.2.5
  * 작 성 자  : 이종철(jclee)
  * 수 정 일  :
  * 수 정 자  :
  * 파 일 명  : JmxConstants.java
  * 버    전  : 0.1
  * 개    요  : JMX에서 사용되는 상수 정의
  * 이    력  : 2006.2.4  신규 생성 
  --------------------------------------------------------------------------*/

package oraclejava.jmx.util;

public class JmxConstants {
       
        //Dt
        public static final String DT_NOT_FOUND = "dt not found";
        public static final String DT_START_OK = "dt start ok";
        public static final String DT_START_FAIL = "dt start fail";       
        public static final String ALREADY_DT_START = "already dt start";
        public static final String DT_STOP_OK = "dt stop ok";
        public static final String DT_STOP_FAIL = "dt stop fail";       
       
        public static final String DT_SCHEDULER_START_OK = "dt scheduler start ok";
        public static final String DT_SCHEDULER_START_FAIL = "dt scheduler start fail";       
        public static final String DT_SCHEDULER_STOP_OK = "dt scheduler stop ok";
        public static final String DT_SCHEDULER_STOP_FAIL = "dt scheduler stop fail";
       
        //Loader
        public static final String LOADER_NOT_FOUND = "loader not found";
        public static final String LOADER_START_OK = "loader start ok";
        public static final String LOADER_START_FAIL = "loader start fail";       
        public static final String ALREADY_LOADER_START = "already loader start";
        public static final String LOADER_STOP_OK = "loader stop ok";
        public static final String LOADER_STOP_FAIL = "loader stop fail";       
       
        public static final String LOADER_SCHEDULER_START_OK = "loader scheduler start ok";
        public static final String LOADER_SCHEDULER_START_FAIL = "loader scheduler start fail";       
        public static final String LOADER_SCHEDULER_STOP_OK = "loader scheduler stop ok";
        public static final String LOADER_SCHEDULER_STOP_FAIL = "loader scheduler stop fail";
       
        //Batch
        public static final String BATCH_NOT_FOUND = "batch not found";
        public static final String BATCH_START_OK = "batch start ok";
        public static final String BATCH_START_FAIL = "batch start fail";       
        public static final String ALREADY_BATCH_START = "already batch start";
        public static final String BATCH_STOP_OK = "batch stop ok";
        public static final String BATCH_STOP_FAIL = "batch stop fail";       
       
       
        public static final String BATCH_SCHEDULER_START_OK = "batch scheduler start ok";
        public static final String BATCH_SCHEDULER_START_FAIL = "batch scheduler start fail";       
        public static final String BATCH_SCHEDULER_STOP_OK = "batch scheduler stop ok";
        public static final String BATCH_SCHEDULER_STOP_FAIL = "batch scheduler stop fail";       
}

=======================================================================
3. batchControlMBean.java
=======================================================================

/*--------------------------------------------------------------------------
  * 시스템명 :
  * 작 성 일  : 2006.2.7
  * 작 성 자  : 이종철(jclee)
  * 수 정 일  :
  * 수 정 자  :
  * 파 일 명  : BatchControlMBean.java
  * 버    전  : 0.1
  * 개    요  : Batch Program 관리를 위한 Scehduler Management위한 JMX용 MBean Interface
  *          BatchControl에서 아래의 추상 메소드를 구현함
  * 이    력  : 2006.2.7 신규 생성 
  --------------------------------------------------------------------------*/
 
package oraclejava.jmx.mbeans;

public interface BatchControlMBean {
        String startBatchScheduler();
        String stopBatchScheduler();
        String start(String pName);
        String startAll();       
        String stop(String pName);       
        String stopAll();
        java.util.List  getRunningJob();
        java.util.Map    getResource();
}


==================================================================
4. BatchControl.java
==================================================================

/*--------------------------------------------------------------------------
  * 시스템명 : SK Telink Mediation System
  * 작 성 일  : 2006.2.7
  * 작 성 자  : 이종철(jclee)
  * 수 정 일  :
  * 수 정 자  :
  * 파 일 명  : BatchControl.java
  * 버    전  : 0.1
  * 개    요  : JMX Management Bean에서 정의한 Interface를 구현
  *          BatchJobScheduler를 통해 Batch Program을 start, stop 시키는 기능
  * 이    력  : 2006.2.7  신규 생성 
  --------------------------------------------------------------------------*/

package com.skcc.skmd.jmx.mbeans;

import com.skcc.skmd.processmgr.BatchJobScheduler;
import com.skcc.skmd.jmx.util.JmxConstants;
import com.skcc.skmd.jmx.util.ExceptionUtil;
import java.util.List;
import java.util.Map;
import com.skcc.skmd.batch.ResourceMng;



public class BatchControl implements BatchControlMBean {       
       
        /*
        * BATCH용 Scheduler를 시작
        */
        public String startBatchScheduler(){
                //return JmxConstants.DT_SCHEDULER_START_OK;
               
                try {                       
                        if (BatchJobScheduler.startScheduler()) {                               
                                return JmxConstants.BATCH_SCHEDULER_START_OK;
                        }
                        else {                               
                                return JmxConstants.BATCH_SCHEDULER_START_FAIL;
                        }               
                }
                catch(Exception e) {
                        e.printStackTrace();
                        ExceptionUtil.printException(e);
                        return JmxConstants.BATCH_SCHEDULER_START_FAIL;
                }                       
        }
       
        /*
        * BATCH용 Scheduler를 종료, Abort
        */
        public String stopBatchScheduler() {
               
        if (BatchJobScheduler.shutdownScheduler()) {                       
                        return JmxConstants.BATCH_SCHEDULER_STOP_OK;
                }
                else {
                        return JmxConstants.BATCH_SCHEDULER_STOP_FAIL;
                }
        }
       

        /**
        * 인자로 입력되는 BATCH PROGRAM을 시작
        */
        public String start(String pName) {       
                       
                //DtJobScheduler.startScheduler();
               
                if (BatchJobScheduler.startJob(pName)) {                       
                        return JmxConstants.BATCH_START_OK;
                }
                else {
                        return JmxConstants.BATCH_START_FAIL;
                }       
        }
       
        /**
        * 등록된 모든 BARCH PROGRAM을 시작
        */
        public String startAll() {
               
                //DtJobScheduler.startScheduler();
               
                if (BatchJobScheduler.startJob("A")) {
                        return JmxConstants.BATCH_START_OK;
                }
                else {
                        return JmxConstants.BATCH_START_FAIL;
                }
        }
       
        /**
        * 인자로 입력되는 BATCH PROGRAM을 정상  종료
        */
        public String stop(String pName) {
               
                if (BatchJobScheduler.stopJob(pName)) {
                        return JmxConstants.BATCH_STOP_OK;
                }
                else {
                        return JmxConstants.BATCH_STOP_FAIL;
                }
        }
       
               
        /**
        * 모든 BATCH PROGRAM을 즉시  종료
        * 
        */
        public String stopAll() {
               
                if(BatchJobScheduler.shutdownScheduler()) {
                        return JmxConstants.BATCH_STOP_OK;
                }
                else {
                        return JmxConstants.BATCH_STOP_FAIL;
                }
        }
       
        /**
        * 현재 돌고 있는 BATCH PROGRAM 목록을 Return
        *
        */
        public List getRunningJob() {
                return BatchJobScheduler.getRunningJob();               
        }
       
       
        /**
        * CPU, Memory, DISK, TableSpace의 자원 정보를 받음
        *
        */
        public Map getResource() {
                return ResourceMng.getResource();               
        }
       
}

댓글 없음:

댓글 쓰기