一、
public class AdminMonitorListener implements ServletContextListener{
private Timer timer = null;
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
timer.cancel();
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
timer = new Timer(true);
//设置任务计划,启动和间隔时间
timer.schedule(new TimerTask(){
public void run() {
// TODO Auto-generated method stub
MonitorAdminServer ath=new MonitorAdminServer();
ath.start();
timer.cancel();
}}, 60000, 60000);
}
}
二、
public class MonitorAdminServer extends Thread {
private final static Log logger = CommonLogger.getInstance();
public void run() {
int port=PropertiesUtil.getPropertyInt("plugs.config.admin.port");
System.out.println("****************************** prot:"+port);
while (true)
try {
ServerSocket server = new ServerSocket(port);
try {
while (true) {
Socket clientSocket = server.accept();
if (clientSocket != null) {
clientSocket.setKeepAlive(true);
clientSocket.setSoTimeout(20000); // 设置超时读不到请求就退出,否则会被监控脚本挂住占着线程
AdminWorkThread swt = new AdminWorkThread(clientSocket);
swt.start();
clientSocket = null;
}
}
} catch (Exception e) {
logger.error("MonitorServer.init error,e=" + e+" |port="+port);
} finally {
if (server != null) {
server.close();
}
}
} catch (Exception e) {
logger.error("MonitorServer.init error,e=" + e+" |port="+port);
// 如果端口被绑定了,则等待60秒后重试,直到成功。
if (e instanceof java.net.BindException) {
try {
Thread.sleep(60000L);
} catch (Exception e1) {
}
}
}
}
}
三、
<listener>
<listener-class>AdminMonitorListener</listener-class>
</listener>