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
请高手指点迷津。

解决方案 »

  1.   

    contextDestroyed start
    [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)
    报的异常
      

  2.   

    你调试下,看serverIps是不是空的
      

  3.   


    不是空
    [INFO ] [15:58:54 203] [PortalServerMonitor.java-<init>-30] serverIp= 192.168.0.112:10500,192.168.0.112:10800
    日志文件有记录
      

  4.   

    private static final Logger logger = LoggerFactory.getLogger(PortalServerMonitor.class);
      

  5.   

    不太清楚你的log4j是怎样配置的,可能和它的配置相关。另外你的Logger是怎样引入的?可以试试直接用struts自己的Logger
    import com.opensymphony.xwork2.util.logging.Logger;
    import com.opensymphony.xwork2.util.logging.LoggerFactory;private static final Logger logger = LoggerFactory.getLogger(PortalServerMonitor.class);
      

  6.   


    log4j和struts没必然联系吧,再说了,我程序没用到struts