java web项目启动就调用定时任务

时间:2022-05-16 21:36:40

这几天领导安排了一个小任务,项目启动后,定时查看客户余额,余额不足则发短息或邮箱提醒。短信和邮箱会在另外一篇文章讲解,这里讲下怎么启动定时任务。这里用到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>