这几天领导安排了一个小任务,项目启动后,定时查看客户余额,余额不足则发短息或邮箱提醒。短信和邮箱会在另外一篇文章讲解,这里讲下怎么启动定时任务。这里用到ServletContextListener,TimerTask相结合
首先编写ServletContext监听。
package lilosoft.listener;
import java.util.Timer;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import lilosoft.timer.SearchBalanceTimer;
public class SearchBalanceListener implements ServletContextListener{
private Timer timer = null;
public void contextInitialized(ServletContextEvent event){
//在这里初始化监听器,在tomcat启动的时候监听器启动,可以在这里实现定时器功能
timer = new Timer(true);
ServletContext context = event.getServletContext();
event.getServletContext().log("定时器已启动");//添加日志,可在tomcat日志中查看到
timer.schedule(new SearchBalanceTimer(context),0,10*1000);//调用SearchBalanceTimer,0表示任务无延迟,5*1000表示每隔5秒执行任务,60*60*1000表示一个小时。
event.getServletContext().log("已经添加任务");
}
public void contextDestroyed(ServletContextEvent event){
//在这里关闭监听器,所以在这里销毁定时器。
timer.cancel();
event.getServletContext().log("定时器销毁");
}
}
在写SearchBalanceTimer查询余额的定时任务
package lilosoft.timer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TimerTask;
import javax.servlet.ServletContext;
import org.json.JSONObject;
public class SearchBalanceTimer extends TimerTask {
private static boolean isRunning = false;
private ServletContext context = null;
public SearchBalanceTimer(ServletContext context) {
this.context = context;
}
@Override
public void run() {
if (!isRunning) {
isRunning = true;
// 在这里编写自己的功能
//查询余额
//发送短信提醒
//发送邮箱提醒
isRunning = false;
} else {
context.log("上一次任务执行还未结束");
}
}
}
在web.xml里添加一下配置
<listener>
<listener-class>
lilosoft.listener.SearchBalanceListener
</listener-class>
</listener>