<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;

      import java.io.BufferedReader;
      import java.io.IOException;
      import java.io.InputStream;
      import java.io.InputStreamReader;
      import java.lang.management.ManagementFactory;
      import java.nio.file.*;
      import java.nio.file.attribute.BasicFileAttributes;

      import static java.nio.file.StandardWatchEventKinds.*;

      public class WatchDog implements Launcher {

      private static Logger LOGGER = LoggerFactory.getLogger(WatchDog.class);
      public static final String ENV_KEY_TARGET = "WATCH_DOG_TARGET";
      private final Launcher launcher;

      public WatchDog(Launcher launcher) {
      this.launcher = launcher;
      }

      @Override
      public void launch(String[] args) {
      if (!startWatchDog()) {
      launcher.launch(args);
      }
      }

      private static boolean startWatchDog() {
      String target = System.getenv(ENV_KEY_TARGET);
      if (null == target) {
      LOGGER.debug("Do not have target for watch dog, launch directly");
      return false;
      }
      LOGGER.debug("Watch dog is watching " + target + " ...");
      watch(target);
      return true;
      }

      private static void watch(String target) {
      try {
      int thisProcessId = Integer.valueOf(ManagementFactory.getRuntimeMXBean().getName().split("@")[0]);
      String thisProcessCommand = getProcessCommand(thisProcessId);
      Process subProcess = launchWithoutWatchDog(thisProcessCommand);
      final WatchService watchService = FileSystems.getDefault().newWatchService();
      try {
      Path targetPath = Paths.get(target);
      Files.walkFileTree(targetPath, new SimpleFileVisitor<Path>(){
      @Override
      public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
      dir.register(watchService, ENTRY_MODIFY, ENTRY_DELETE, ENTRY_CREATE);
      return super.preVisitDirectory(dir, attrs);
      }
      });
      while (true) {
      WatchKey key = watchService.take();
      key.pollEvents();
      key.reset();
      while (null != (key = watchService.poll())) {
      key.pollEvents();
      key.reset();
      }
      subProcess.destroy();
      subProcess = launchWithoutWatchDog(thisProcessCommand);
      }
      } finally {
      watchService.close();
      }
      } catch (Throwable e) {
      throw new RuntimeException("Failed to watch " + target, e);
      }
      }

      private static String getProcessCommand(int processId) {
      String command = "pargs -l " + processId;
      try {
      Process process = Runtime.getRuntime().exec(command);
      process.waitFor();
      return readAll(process.getInputStream());
      } catch (Throwable e) {
      throw new RuntimeException("Failed to execute " + command, e);
      }
      }

      private static String readAll(InputStream inputStream) throws IOException {
      try {
      BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
      StringBuilder result = new StringBuilder();
      String line;
      while (null != (line = reader.readLine())) {
      result.append(line);
      }
      return result.toString();
      } finally {
      inputStream.close();
      }
      }

      private static Process launchWithoutWatchDog(String command) {
      try {
      LOGGER.info("Launch: " + command);
      ProcessBuilder processBuilder = new ProcessBuilder();
      processBuilder.command(command.replace("'", "").split(" "));
      processBuilder.environment().remove(ENV_KEY_TARGET);
      processBuilder.inheritIO();
      return processBuilder.start();
      } catch (Throwable e) {
      throw new RuntimeException("Failed to launch without watch dog: " + command, e);
      }
      }
      }
      public interface Launcher {

      public void launch(String[] args);
      }


      五項關鍵技術:

      1. 代碼改動的時候自動更新class,這個部分交由IDE來完成。
      2. 獲取當前Java進程的啟動命令行
        1. 獲取當前進程的PID,由JMX的api完成
        2. 由PID獲得命令行參數,這個部分由solaris的pargs完成,其他操作系統也有類似命令
      3. 探測文件夾內容的改動,由Java7的WatchServer完成
      4. 在Java進程內,啟動另外一個Java進程。由Java7的ProcessBuilder完成。注意inheritIO這個太方便了。
      5. 同一個main函數,兩種執行狀態(監控和非監控)。由傳入不同的環境變量完成。如果沒有WATCH_DOG_TARGET那么就執行真正的main,如果有則把當前進程作為監控進程。
      posted on 2012-03-11 01:24  taowen  閱讀(1757)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 无码h黄肉动漫在线观看| 亚洲色拍拍噜噜噜最新网站| 日韩精品一区二区三区久| 少妇午夜啪爽嗷嗷叫视频| 亚洲大尺度无码无码专线| 伊人av超碰伊人久久久| 人人妻人人澡人人爽曰本| 亚洲精品成人片在线观看精品字幕| 性男女做视频观看网站| 九九热爱视频精品视频| 免费VA国产高清大片在线| 国产精品久久久久鬼色| 日韩成人午夜精品久久高潮| 精品一区二区三区波多野结衣 | 东京热人妻丝袜无码AV一二三区观| 非会员区试看120秒6次| 精品国产线拍大陆久久尤物| 国模雨珍浓密毛大尺度150p| 在线无码免费的毛片视频| 精品久久久久久国产| 乱女乱妇熟女熟妇综合网| 永泰县| 2020年最新国产精品正在播放| 国产桃色在线成免费视频| 国产精品自在线拍国产手青青机版 | 亚洲熟女乱色一区二区三区| 亚洲国产av久久久| 极品人妻少妇一区二区三区| 9久9久热精品视频在线观看| 衢州市| 国产不卡av一区二区| 精品人妻一区二区三区蜜臀 | 国产AV无码专区亚洲AWWW| 黑人玩弄人妻中文在线| 好爽毛片一区二区三区四| 乐亭县| 一区二区三区自拍偷拍视频| 成人午夜精品无码区久久| 亚洲一品道一区二区三区 | 男女啪啪高潮激烈免费版| 欧洲国产成人久久精品综合|