Java控制启动ES
需求:
在程序初始化的时候检测ES端口是否被占用,被占用的情况下再次判断占用端口的进程是否是ES,如果端口没有被占用则启动ES。
逻辑:
情况1:程序初始化->检测端口占用情况->已被占用->检测ES是否开启->已开启->return
情况2:程序初始化->检测端口占用情况->未被占用->开启ES
情况3:程序初始化->检测端口占用情况->已被占用->检测ES是否开启->未开启->开启ES
//检测端口占用情况 //使用socket连接地址下的端口,可以连接证明端口已被占用 public boolean portState(){ //占用状态,false为未占用 boolean state = false; try{ //尝试创建连接 Socket socket = new Socket("127.0.0.1",9200); //不抛异常则以占用,返回结果 state = true; return state; }catch(IOException e){ System.out.println("端口未被占用,即将启动ES!") } reurn state; } //检测ES是否启动 //ES启动后可以访问9200的地址 //所以我们使用URL对地址进行访问 //接收返回的字符串进行判断 public boolean isRunning(){ //启动状态,false为未启动 boolean state = false; try{ //ES的访问地址 URL url = new URL("http://127.0.0.1:9200"); //访问 URLConnection urlc = url.openConnectiom(); //创建输入流对结果进行读取,并设置结果的编码格式 InputStremReader isr = new InputStreamReader(urlc.getInputStream(),"GBK"); BufferedReader br = new BufferedReader(isr); //接收结果并进行判断 String result = null; while((result = br.readLine()) != null){ //这个条件是因为我的ES名字叫这个 if(result.indexOf("elasticsearch") > 0){ //状态改变,结束循环 state = true; System.out.println("ES已经启动了!") break; } } //释放资源 br.close(); isr.close(); }catch(MalformedURLException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); } return state; } //启动ES我是用的vbs脚本,通过vbs调用bat来隐藏cmd窗口,不太会这玩意儿,见谅 vbs原文如下: Set ws = CreateObject("Wscript.Shell") //D:\ES\bin\elasticsearch.bat:这是我启动ES的bat的路径 ws.run "cmd /c D:\ES\bin\elasticsearch.bat",0 //启动ES方法 public void startES(){ //文件路径,方便调试 String FilePath = "D:/ES/"; try{ //执行vbs Process process = RunTime.getRuntime().exec("cmd.exe /c"+filePath+"startES.vbs"); }cath(IOException e){ e.printStackTrace(); } } //集成逻辑判断 public void execSubBoot(){ System.out.println("准备启动ES...") //判断端口状态 if(portState()){ //判断ES状态 if(isRunning()){ //启动了就返回 return; } System.err.println("端口被占用了!"); return; } startES(); System.out.println("ES启动成功!"); }