实现功能内容:手动配置weblogic控制台用户名和密码,自动监控weblogic独占或者粘滞,自动转储问题线程,自动上传转储线程日志,自动实现发送短信,自动实现中文语音播报。
需要监控的weblog控制台 config.xml
一个控制台管理多个服务器上的多个节点。
<?xml version="1.0" encoding="gb2312"?>
<monitor>
<weblogics>
<weblogic name="hxhd" ip="137.12.1.101" port="9901" username="weblogic"
password="JShxhd185">
<node>
<name>hxhd_jlsw_svr001,hxhd_jlsw_svr002,hxhd_jlsw_svr003,hxhd_jlsw_svr004</name>
<ip>137.12.1.101</ip>
<username>weblogic</username>
<password>SC4456</password>
</node>
<node>
<name>hxhd_jlsw_svr005,hxhd_jlsw_svr006,hxhd_jlsw_svr007,hxhd_jlsw_svr008</name>
<ip>137.12.1.102</ip>
<username>weblogic</username>
<password>SC4456</password>
</node>
<node>
<name>hxhd_jlsw_svr009,hxhd_jlsw_svr010,hxhd_jlsw_svr011,hxhd_jlsw_svr012</name>
<ip>137.12.1.103</ip>
<username>weblogic</username>
<password>SC4456</password>
</node>
</weblogic>
</weblogics>
</monitor>
整个监控程序采用服务器与客户端模式,服务器生成问题节点的线程信息,推送给客户端报警,同时转储问题线程,发送短信。
package com.css.monitor;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
public class MultiServer {
static Logger log = Logger.getLogger(MultiServer.class);
public static void main(String[] args) {
try {
log.info("创建服务器端的ServerSocket对象,等待客户端连接-------------------------");
ServerSocket serverSocket = new ServerSocket(6666);
// 2.创建线程池,从而可以处理多个客户端
ThreadPoolExecutor ThreadPoolExecutor = (java.util.concurrent.ThreadPoolExecutor) Executors
.newFixedThreadPool(10);
ScheduledThreadPoolExecutor ScheduledThreadPoolExecutor = (ScheduledThreadPoolExecutor) Executors
.newScheduledThreadPool(1);
ScheduledThreadPoolExecutor.scheduleAtFixedRate(new ServerTestTask(), 1, 3, TimeUnit.SECONDS);
ThreadPoolExecutor.execute(new ThreadMonitor());
for (int i = 0; i < 10; i++) {
// 3.侦听客户端
Socket socket = serverSocket.accept();
log.info("有新的客户端加入-----------------------");
// 4.启动线程
log.info("服务端启动线程监听begin--------------------");
System.out.println("getActiveCount:" + ThreadPoolExecutor.getActiveCount());
System.out.println("getCompletedTaskCount:" + ThreadPoolExecutor.getCompletedTaskCount());
System.out.println("getCorePoolSize:" + ThreadPoolExecutor.getCorePoolSize());
System.out.println("getLargestPoolSize:" + ThreadPoolExecutor.getLargestPoolSize());
System.out.println("getPoolSize:" + ThreadPoolExecutor.getPoolSize());
System.out.println("getTaskCount:" + ThreadPoolExecutor.getTaskCount());
ServerListener r = new ServerListener(socket);
ThreadPoolExecutor.execute(r);
System.out.println("服务端启动线程监听end--------------------");
}
// 5.关闭线程池
ThreadPoolExecutor.shutdown();
// 6.关闭服务器
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器端运行MultiServer类的主方法,采用线程池的方式管理,通过ServerSocket启动服务器6666端口,客户端监听这个端口实现数据传输。
ThreadMonitor 主要实现服务器端线程监控工作。
ServerListener 主要实现服务器端监听客户端连接工作。最多可以监控10个客户端同时连接。
ServerTestTask 主要实现服务器端监听客户端是否断开,维护客户端连接工作。
ParserForXml 主要实现服务器端解析config.xml,并建立与weblogic控制台的连接,保存到JMXmap静态变量里面。
ThreadDump 主要实现服务器端自动线程转储,通过远程登录方式实现执行服务器shell脚本。
RemoteInvokeShell(
"137.12.74.44",
22,
"weblogic",
"SChxhd@4456",
"sh /weblogic/Oracle/Middleware/user_projects/domains/zc.sh hxhd_jlsw_svr001 sdfsdfsd");
}
服务器的功能类CodeUtil和ShortMsgUtil 主要实现发送短信功能,前台需要有短信平台支持。
DBoption主要实现服务器端对异常线程做记录。
zc.sh 此文件需要提前放到 应用服务器中,指定位置(/weblogic/Oracle/Middleware/user_projects/domains/zc.sh)用户自动转储文件、自动上传ftp服务器(前提需要自行搭建ftp服务器)。
客户端需要执行MultiClient类实现语音报警。
ClientReadServer 主要实现客户端接收服务器端传来的问题节点。通知运维人员处理。
客户端使用了jacob 这个东西可以实现文字转语音的功能。
注意32位 和64位windows 客户端需要注册 2个dll文件。
nodeName.properties 文件为weblogic节点名称的中文对照。
ClientSendServer 主要实现客户端与服务器简单交互功能。
ClientTestTask 主要目的是客户端不停的发送信息到服务器,防止客户端掉线问题。
singel 文件夹 暂时未用到不用做考虑。
整个目录结构为:
最后运行程序时候建议打包成2个jar包,服务器一个jar,客户端一个jar
本文片段代码在网上查找,整个业务处理流程及其代码整合过程完成自行书写。
祝君时效运维、开心运维。