java:监控线程,当线程异常时自动重启线程

上一篇 / 下一篇  2012-07-24 13:04:39 / 个人分类:java

所要监控的线程:
public class Basic extends Thread {


    private String hostname = "";
    private String username = "";
    private String password = "";
    private Long bizId = 0L;
    private SqlMessageService sqlService;
    public SqlMessageService getSqlService() {
        return sqlService;
    }
    public void setSqlService(SqlMessageService sqlService) {
        this.sqlService = sqlService;
    }
    private String commands;
    public Basic(String threadName){
        super();
        this.setName(threadName);
    }


    public String getCommands() {
        return commands;
    }
    public void setCommands(String commands) {
        this.commands = commands;
    }
    public void run() {
        while(true){
            Connection conn = new Connection(hostname);
            try {
                conn.connect();
                boolean isAuthenticated = conn.authenticateWithPassword(
                        username, password);
                if (isAuthenticated == false)
                    System.out.println("Authentication failed.");
                Session sess = conn.openSession();
                sess.execCommand(commands);
                InputStream stdout = new StreamGobbler(sess.getStdout());

                BufferedReader br = new BufferedReader(new InputStreamReader(
                        stdout));
                String line="";
                while (true) {
                    line = br.readLine();
                    if (StringUtils.isNotBlank(line)){
                       
                        System.out.println(line);
                    }else{
                        break;
                    }
                   
                }
                sess.close();
                conn.close();
                sleep(5);

            } catch (Exception e) {
                e.printStackTrace();
            }
           
        }

    }

    Date getDate(String url) throws Exception{
        String[] sqls=url.split(",");
        String time=sqls[0];
        String[] parsePatterns = { "yyyy-MM-dd HH:mm:ss"};
        Date date=DateUtils.parseDate(time, parsePatterns);
        return date;
    }
    public String getHostname() {
        return hostname;
    }

    public void setHostname(String hostname) {
        this.hostname = hostname;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Long getBizId() {
        return bizId;
    }

    public void setBizId(Long bizId) {
        this.bizId = bizId;
    }



}
监控线程
public class Monitor extends Thread {

    private List<Thread> monitoredThread; // 要监控的线程名

    public Monitor(List<Thread> monitoredThread) {
        this.monitoredThread = monitoredThread;
    }

    public void run() {
        while (true) {
            monitor();
            try {
                TimeUnit.MILLISECONDS.sleep(2000);
            } catch (InterruptedException e) {
                // TODO 记日志
                e.printStackTrace();
            }
        }

    }

    /**
     * 监控主要逻辑
     */
    private void monitor() {
        for (int i = 0; i < monitoredThread.size(); i++) {
            Thread.State state = monitoredThread.get(i).getState(); // 获得指定线程状态

//            System.out.println(monitoredThread.get(i).getName() + "监控线程状态是:"
//                    + monitoredThread.get(i).getState());

            /*
             * 如果监控线程为终止状态,则重启监控线程
             */
            if (Thread.State.TERMINATED.equals(state)) {
                System.out.println(monitoredThread.get(i).getName()
                        + "监控线程已经终止,现在开始重启监控线程!");
                monitoredThread.get(i).start();
            }
        }
    }

    /**
     * 测试方法
     */
    public static void main(String[] args) {

        Basic tm = new Basic("test");
        tm.setCommands("tail -f XXXX.log");
        tm.setHostname("IP");
        tm.setPassword("XXXX");
        tm.setUsername("XXXX");
        tm.start();
        Basic tm1 = new Basic("test1");
        tm1.setCommands("tail -f XXXX.log");
        tm1.setHostname("XXXX");
        tm1.setPassword("XXXX^^");
        tm1.setUsername("XXXX");
        tm1.start();
        List<Thread> list = new ArrayList<Thread>();
        list.add(tm);
        list.add(tm1);
        Monitor m = new Monitor(list);
        m.start();

    }
}


TAG:

 

评分:0

我来说两句

Open Toolbar