我在一个项目中需要监控短信平台转发过来的短信,我就写了一个定时器。
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);//处理回复的短信
}
}
}
}
这些程序在服务器启动的时候就加载了,开始的时候也能正常工作,但一般过几个小时以后就定时器就不工作了。不知道出了什么问题。麻烦哪位高手指导一下。
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);//处理回复的短信
}
}
}
}
这些程序在服务器启动的时候就加载了,开始的时候也能正常工作,但一般过几个小时以后就定时器就不工作了。不知道出了什么问题。麻烦哪位高手指导一下。
我觉得以下这四个地方前面的引用有可能出现null对象。timer是单线程的,抛异常未捕获timer就死了。
1,Queue que=fac.getQueue();
2,obj=que.pop();
3,mo = ((CMoReq)obj);
4,MSGTest t=MSGTest.getInstance();
最好是外面用throwable捕获看看什么异常。