最近用swing写了一个小程序,用于监控服务器上的服务,历时半个月,最终成功测试上线,现对它进行总结
需求:扫描服务器上指定位置的服务,把各个服务按照端口号、项目名、状态、启动路径罗列出来,并增加定时器监控服务状态,如果发现服务崩溃,则杀死此服务并重新启动。界面如下图:
思路如下:
1、扫描指定路径,找出server.bat(服务的启动文件),然后根据server.bat的路径得到tomcat下的server.xml文件并解析出里面的端口号,再获取tomcat下webapps中除了默认的文件夹外的文件夹名,得到服务的运行环境名,然后获取本机的ip,根据ip,端口号,运行环境名发送一个登录请求判断服务是否成功启动,如果启动成功,将状态改为Running,否则则改为Disconnct。
2、在表格每行增加一个右击功能,其中分别有“开启服务”“停止服务”“删除服务”三个功能,如下图
I.开启服务:直接使用Desktop.getDesktop().open(new File("path"));
来执行.bat文件。
II.停止服务:通过
String[] cmd = {"tasklist"};
Process process = Runtime.getRuntime().exec(cmd);
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String string_temp = "";
while ((string_temp = in.readLine()) != null) {}
循环获取系统当前进程,截取出每个进程的pid,然后Sigar包得到进程的启动路径,根据启动路径与服务路径比较获取指定服务进程,然后杀死进程。
III.删除服务:仅仅删除JTable中的数据,不影响服务文件。
3、编写一个定时器,定时发送请求判断服务的状态,如果服务是Disconnect,则杀死该服务,并重新启动服务。
Runnable runnable = new Runnable() {
public void run() {
//定时任务
}
};
service = Executors.newSingleThreadScheduledExecutor();
// 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间
service.scheduleAtFixedRate(runnable, 0, times, TimeUnit.HOURS);
4、在最下面显示一个JTextArea,用来显示扫描进度。
5、扫描完成后在本地增加缓存txt文件,以key-value的形式存至txt文件中,key为扫描路径,value为list返回值,一个路径对应缓存文件中的一行,然后下次扫描时先判断缓存文件中是否存在该扫描路径,如果存在则直接读取缓存文件中的value值并返回,不存在则扫描该路径。
技术总结:主要是文件的递归扫描,xml文件的读取和txt文件的读写,获取系统的ip、进程信息,以及java执行cmd命令。
//执行.bat之类的文件,带弹窗
Desktop.getDesktop().open(new File("文件路径"));
注意:在Swing生成可执行jar包的时候,因为项目中用了sigar.jar,要使用这个除了jar包还需要一个.dll的库,而这个.dll库在导出的时候不能跟着导出,所以需要手动把它加入到导出的jar包文件夹中,不然会导致sigar不能使用。