我在一个项目中需要监控短信平台转发过来的短信,我就写了一个定时器。
import com.fswan.db.TableClass;
import com.sms.cpa.CMoReq;
import com.sms.cpa.CReportReq;
import com.sms.cpa.CSendRet;
import com.sms.impl.GSTEngineFactory;
import com.sms.impl.Queue;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;public class TestMsg {
private static TestMsg instance=null;
private static String key="key";
private TestMsg(){}
private static GSTEngineFactory gf=null;
public static TestMsg getInstance(){
if(instance==null){
synchronized(key){
if(instance==null){
instance=new TestMsg();
init();
}
}
}
return instance;
}
private static void init(){
try {
gf=GSTEngineFactory.getInstance(username, password);
int flag=gf.loginEngin();//登陆短信平台
Date date=new Date();
Timer timer=new Timer();
TestTimer mt=new TestTimer(gf);
long timestamp=50000;
timer.schedule(mt, date, timestamp);//启动定时器
} catch (Exception e) {
e.printStackTrace();
}
}

}
/*
定时器
*/
class TestTimer extends TimerTask{
private static GSTEngineFactory fac=null;
private static int i;
public  TestTimer(GSTEngineFactory fac){
this.fac=fac;
}
@Override
public void run() {
Queue que=fac.getQueue();
i=que.size();
System.out.println(que.isEmpty());
while(!que.isEmpty()){
Object obj = null;
CReportReq report = null;
CMoReq mo = null;
CSendRet send = null;
obj=que.pop();
 if(obj instanceof CMoReq) {//判断是否是上行信息
mo = ((CMoReq)obj);
String tmpAgent = mo.sAgent;//MO 消息 来源 Agent/SMSC ID
String tmpFrom = mo.sFrom; //源手机号码
String tmpTarget = mo.sTarget;  //目的手机号码
String tmpMessage = new String(mo.bMessage); //消息内容 
MSGTest t=MSGTest.getInstance();
t.pd(tmpMessage,tmpFrom);//处理回复的短信
}
}
}
}
这些程序在服务器启动的时候就加载了,开始的时候也能正常工作,但一般过几个小时以后就定时器就不工作了。不知道出了什么问题。麻烦哪位高手指导一下。

解决方案 »

  1.   

    你可以使用Quartz来实现定时任务,网上关于他的资料很多
      

  2.   

    建议使用Quartz   spring也有整合Quartz, 也很容易实现
      

  3.   

    程序能跑起来,说明正常情况下没有问题。
    我觉得以下这四个地方前面的引用有可能出现null对象。timer是单线程的,抛异常未捕获timer就死了。
    1,Queue que=fac.getQueue(); 
    2,obj=que.pop(); 
    3,mo = ((CMoReq)obj); 
    4,MSGTest t=MSGTest.getInstance(); 
      

  4.   

    前三个是短信平台提供商提供的,应该没什么问题,如果第一个是null,那2,3,4就不会执行的,只有1不为null,也就是说有短信转过来的时候才能执行
      

  5.   

    恩,你的程序我大概看了一下,如果涉及到ftp,那么系统停很正常,如果不涉及到ftp,那么应该就是异常把timer干死了。
    最好是外面用throwable捕获看看什么异常。
      

  6.   

    问题解决了,如3楼所说,出现了异常而没有捕获,这是个简单的定时器,我觉得没必要用Quartz,当然同时要感谢1,2楼。结帖去了。