public class PortalServerMonitor implements Runnable {
private static final Logger logger = Logger.getLogger(PortalServerMonitor.class);
private String[] serverIps;
private Set<String> badServers;
private Set<String> goodServers;
public boolean isStop;
private static PortalServerMonitor PSM=new PortalServerMonitor();
public static final String WLANSERVERIP="wlanserverip";
public PortalServerMonitor(){
badServers=new HashSet<String>();
goodServers=new HashSet<String>();
isStop=new Boolean(false);
String file="webservice_and_localserver.properties";
Properties prop=GetPropertiesValues.getProperties(file);
String serverIp=prop.getProperty(WLANSERVERIP);
serverIps=serverIp.split(",");
logger.info("serverIp= "+serverIp);
}
public static PortalServerMonitor getInstance(){
return PSM;
}
public void run(){
logger.info("isStop is "+isStop);
try{
while(true && !isStop){
logger.info("enter loop");
for(int i=0;i<serverIps.length;i++){
String ser=serverIps[i];
try {
Socket s=new Socket(ser.split(":")[0],Integer.parseInt(ser.split(":")[1]));
Boolean isConnect=s.isConnected();
if(isConnect){
this.goodServers.add(ser);
logger.info("server "+ser+" now is good");
}
s.close();
} catch (NumberFormatException e) {
logger.error(ser+" server port parameter is not a number");
this.badServers.add(ser);
} catch (UnknownHostException e) {
logger.error(ser+" the server ip is not validate");
this.badServers.add(ser);
} catch (IOException e) {
logger.error(ser+" IOException put it into badServers");
this.badServers.add(ser);
}
}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
logger.error("ServerMonitor::run() InterruptedException occur when sleeping ");
break;
}
}
System.out.println("PortalServerMonitor is stop ");
System.out.println(logger.hashCode());
System.out.println("logger is null is "+(logger==null));
//报空指针
logger.info("Thread is stop");
}catch(Exception e){
e.printStackTrace();
}
}
public void stop(){
isStop=true;
logger.info("Set PortalServerMonitor's isStop=true");
}
public Set<String> getGoodServers(){
return goodServers;
}
public Set<String> getBadServers(){
return badServers;
}
}环境是这样的,PortalServerMonitor是一个监视线程,通过tomcat启动监听器启动,
当tomcat关闭的时候,销毁该监视线程,
但是程序到 logger.info("Thread is stop");这行报空指针,
System.out.println("logger is null is "+(logger==null));这行没问题,并且logger==null是false
请高手指点迷津。
private static final Logger logger = Logger.getLogger(PortalServerMonitor.class);
private String[] serverIps;
private Set<String> badServers;
private Set<String> goodServers;
public boolean isStop;
private static PortalServerMonitor PSM=new PortalServerMonitor();
public static final String WLANSERVERIP="wlanserverip";
public PortalServerMonitor(){
badServers=new HashSet<String>();
goodServers=new HashSet<String>();
isStop=new Boolean(false);
String file="webservice_and_localserver.properties";
Properties prop=GetPropertiesValues.getProperties(file);
String serverIp=prop.getProperty(WLANSERVERIP);
serverIps=serverIp.split(",");
logger.info("serverIp= "+serverIp);
}
public static PortalServerMonitor getInstance(){
return PSM;
}
public void run(){
logger.info("isStop is "+isStop);
try{
while(true && !isStop){
logger.info("enter loop");
for(int i=0;i<serverIps.length;i++){
String ser=serverIps[i];
try {
Socket s=new Socket(ser.split(":")[0],Integer.parseInt(ser.split(":")[1]));
Boolean isConnect=s.isConnected();
if(isConnect){
this.goodServers.add(ser);
logger.info("server "+ser+" now is good");
}
s.close();
} catch (NumberFormatException e) {
logger.error(ser+" server port parameter is not a number");
this.badServers.add(ser);
} catch (UnknownHostException e) {
logger.error(ser+" the server ip is not validate");
this.badServers.add(ser);
} catch (IOException e) {
logger.error(ser+" IOException put it into badServers");
this.badServers.add(ser);
}
}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
logger.error("ServerMonitor::run() InterruptedException occur when sleeping ");
break;
}
}
System.out.println("PortalServerMonitor is stop ");
System.out.println(logger.hashCode());
System.out.println("logger is null is "+(logger==null));
//报空指针
logger.info("Thread is stop");
}catch(Exception e){
e.printStackTrace();
}
}
public void stop(){
isStop=true;
logger.info("Set PortalServerMonitor's isStop=true");
}
public Set<String> getGoodServers(){
return goodServers;
}
public Set<String> getBadServers(){
return badServers;
}
}环境是这样的,PortalServerMonitor是一个监视线程,通过tomcat启动监听器启动,
当tomcat关闭的时候,销毁该监视线程,
但是程序到 logger.info("Thread is stop");这行报空指针,
System.out.println("logger is null is "+(logger==null));这行没问题,并且logger==null是false
请高手指点迷津。
[INFO ] [15:47:26 609] [PortalServerMonitor.java-stop-79] Set PortalServerMonitor's isStop=true
2010-7-12 15:47:27 org.apache.catalina.core.ApplicationContext log
信息: SessionListener: contextDestroyed()
2010-7-12 15:47:27 org.apache.catalina.core.ApplicationContext log
信息: ContextListener: contextDestroyed()
2010-7-12 15:47:27 org.apache.coyote.http11.Http11Protocol destroy
信息: Stopping Coyote HTTP/1.1 on http-8080
PortalServerMonitor is stop
30390274
logger is null is false
java.lang.NullPointerException
at org.apache.log4j.helpers.PatternConverter.spacePad(PatternConverter.java:107)
at org.apache.log4j.helpers.PatternConverter.format(PatternConverter.java:80)
at org.apache.log4j.PatternLayout.format(PatternLayout.java:502)
at org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:302)
at org.apache.log4j.WriterAppender.append(WriterAppender.java:160)
at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
at org.apache.log4j.Category.callAppenders(Category.java:206)
at org.apache.log4j.Category.forcedLog(Category.java:391)
at org.apache.log4j.Category.info(Category.java:666)
at com.huawei.aaa.wlan.smsservice.listener.PortalServerMonitor.run(PortalServerMonitor.java:72)
at java.lang.Thread.run(Unknown Source)
报的异常
不是空
[INFO ] [15:58:54 203] [PortalServerMonitor.java-<init>-30] serverIp= 192.168.0.112:10500,192.168.0.112:10800
日志文件有记录
import com.opensymphony.xwork2.util.logging.Logger;
import com.opensymphony.xwork2.util.logging.LoggerFactory;private static final Logger logger = LoggerFactory.getLogger(PortalServerMonitor.class);
log4j和struts没必然联系吧,再说了,我程序没用到struts