SqlOnlineThread.java 6.22 KB
package com.sitech.ismp.coll.cron;

import com.sitech.base.AgentProperties;
import com.sitech.ismp.coll.basic.TblATO_KPIDETAIL;
import com.sitech.ismp.messageObject.ScheduleLog;
import com.sitech.util.DES3;
import com.sitech.util.Formater;
import com.sitech.util.JSONUtil;
import com.sitech.util.RandomGUID;
import com.sitech.util.mq.MQConstants;
import com.sitech.util.mq.TunnelFactory;
import org.apache.log4j.Logger;

import java.sql.*;
import java.util.*;
import java.util.Date;

/**
 * Created with IntelliJ IDEA.
 * User: Linxc
 * Date: 14-3-5
 * Time: 下午1:47
 * To change this template use File | Settings | File Templates.
 */
public class SqlOnlineThread {
    private static Logger logger = Logger.getLogger(SqlOnlineThread.class);

    private String url = null;

    private String schId;

    private String reqId;

    private String trigerType;

    private String oprType;

    private String nextFireTime;

    private String agentId;

    private Connection conn = null;

    private List<Map<String,String>> sqlList = new ArrayList<Map<String,String>>();

    private String beginTime;

    private String endTime;

    public void execute(Map<String, String> params) {
        int seq = Integer.parseInt(CronConstants.SEQ_1);

        try {
            init(params);

            // 日志内容  seq  endtime  附加信息 执行状态
            sendScheduleLogs("开始执行SQL...", String.valueOf(seq++), null, null, null, CronConstants.SCHEDULE_LOG_MANUAL);

            boolean flag = true;
            for (Map<String, String> sqlMap : sqlList) {
                // 执行多个SQL
                flag = flag && executeSql(sqlMap, String.valueOf(seq++));
            }

            String scrStatus = flag ? CronConstants.SCRIPT_EXEC_SUCCESS : CronConstants.SCRIPT_EXEC_FAILED;

            sendScheduleLogs("执行SQL结束!", String.valueOf(seq), Formater.datetimeToString(new Date()), null, scrStatus, CronConstants.SCHEDULE_LOG_MANUAL);
        } catch (Exception e) {
            logger.error(e.getMessage(), e);

            sendScheduleLogs("执行SQL失败:" + e.getMessage(), String.valueOf(seq),
                    Formater.datetimeToString(new Date()), null,
                    CronConstants.SCRIPT_EXEC_FAILED, CronConstants.SCHEDULE_LOG_MANUAL);
        } finally {
            if (null != conn) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    logger.error("Exception while close jdbc connection, url=" + this.url, e);
                }
            }
        }
    }

    private boolean executeSql(Map<String, String> sqlMap, String seq) throws Exception {
        String sql = sqlMap.get("SQL");
        String logInfo = "Excute Sql:" + sql + ", " + sqlMap.get("ID");
        Statement stmt = null;

        boolean status = false;
        try {
            stmt = conn.createStatement();
            stmt.execute(sql);

            logInfo += CronConstants.SCRIPT_EXEC_SUCCESS;
            logger.info("-- Excute sql:\n" + sql + ", RETURN=" + logInfo);

            status = status && true;
        } catch (Exception e) {
            logInfo += CronConstants.SCRIPT_EXEC_FAILED + ",REASON=" + e.getMessage();
            logger.error("Failed Execute Sql: " + sql + ", url=" + this.url + ", " + e.getMessage(), e);
            status = status && false;
        } finally {
            if (null != stmt) {
                stmt.close();
            }
            // 日志内容  seq  endtime  附加信息 执行状态 日志类型
            sendScheduleLogs(logInfo, seq, null, null, null, CronConstants.SCHEDULE_LOG_SCRIPT);
        }

        return status;
    }

    private void init(Map<String, String> params) throws Exception {
        this.url = params.get("URL");
        this.schId = params.get("SCHEDULE_ID");
        this.reqId = params.get("REQUEST_ID") == null? RandomGUID.getRandomGUID() : params.get("REQUEST_ID");
        this.nextFireTime = params.get("NEXT_FIRE_TIME");
        this.agentId = AgentProperties.AGENT_ID;
        this.trigerType = params.get("TRIGGER_TYPE") == null ? "" : params.get("TRIGGER_TYPE");
        this.oprType = params.get("OPERATE_TYPE") == null ? "" : params.get("OPERATE_TYPE");
        this.beginTime =  Formater.datetimeToString(new Date());
        String className = params.get("CLASSNAME");
        String userName = params.get("USERNAME");
        String password = params.get("PASSWORD");

        String jsonSql = params.get("JSON_SQL");
        sqlList = (List<Map<String, String>>) JSONUtil.fromJSON(jsonSql);
        password = DES3.decrypt(password);

        Class.forName(className);
        this.conn = DriverManager.getConnection(url, userName, password);
    }


    private void sendScheduleLogs(String logContent, String seq, String endTime, Map<String,Object> extInfo, String scrStatus, String logType){
        ScheduleLog log = new ScheduleLog();

        if (null != endTime && !"".equals(endTime.trim())) {
            log.setEndTime(endTime);
            log.setScrStatus(scrStatus);
        }

        log.setBeginTime(beginTime);
        log.setLogType(logType);
        log.setOperateType(oprType);
        log.setAgentId(agentId);
        log.setNextFireTime(nextFireTime);
        log.setType("std_out");
        log.setSchId(schId);
        log.setRequestId(reqId);
        log.setSeq(seq);
        log.setLogInfo(logContent);
        log.setTrigerType(trigerType);
        log.setExtInfo(extInfo == null ? new HashMap<String, Object>() : extInfo);
        logger.info("sendScheduleLogs: " + JSONUtil.toJSON(log));
        TunnelFactory.getTunnel(MQConstants.Q_ROPORT_FROM_AGENT).writeData(log);
    }

//    public static void main(String[] args) {
//        Map<String, String> params = new HashMap<String, String>();
//        params.put("URL","jdbc:oracle:thin:@172.21.0.69:1526:bnms");
//        params.put("CLASSNAME","oracle.jdbc.driver.OracleDriver");
//        params.put("USERNAME","bnms15");
//        params.put("PASSWORD",DES3.encrypt("bnms15"));
//        params.put("JSON_SQL","[{\"SQL\":\"select * from dual1\",\"ID\":\"FLAG=TAB1-0,EXE_RST=\"},{\"SQL\":\"select * from dual\",\"ID\":\"FLAG=TAB1-1,EXE_RST=\"},{\"SQL\":\"select * from dual\",\"RETURN\":\"FLAG=TAB1-2,EXE_RST=\"}]");
//
//        new SqlOnlineThread().execute(params);
//    }
}