MyQuan

Servlet监视器以及Timer定时器的使用记录
前言 最近在写一个小小的项目,基于javaweb的好友生日提醒,在好友生日快到的时候发邮件提醒自己。因为要每天...
扫描右侧二维码阅读全文
13
2019/03

Servlet监视器以及Timer定时器的使用记录

  • 前言

    最近在写一个小小的项目,基于javaweb的好友生日提醒,在好友生日快到的时候发邮件提醒自己。因为要每天检测有没有人要过生日了,所以服务器端必须每天在某个时间段检查并做出判断。

    正文

    要做到随着tomcat服务器启动,然后每天又只在某个时间段运行一次,所以我找到了监视器和Timer定时器。

    代码

    package Mail;

    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Timer;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.annotation.WebListener;

    import Mail.SearchTimer;
    @WebListener
    public class SearchBalanceListener implements ServletContextListener{

    private Timer timer = null;
    public void contextInitialized(ServletContextEvent event){
        //在这里初始化监听器,在tomcat启动的时候监听器启动,可以在这里实现定时器功能
        Timer timer = new Timer(true);
        ServletContext context = event.getServletContext();
    
        event.getServletContext().log("定时器已启动");//添加日志,可在tomcat日志中查看到
        Calendar calendar = Calendar.getInstance();
        int nowday=calendar.get(Calendar.DATE);
        calendar.set(Calendar.DATE, nowday+1);
        // 时
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        // 分
        calendar.set(Calendar.MINUTE,0);
        // 秒
        calendar.set(Calendar.SECOND, 0);
        // 毫秒
        calendar.set(Calendar.MILLISECOND, 0);
    
        Date time = calendar.getTime();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        String format = df.format(time);
        System.out.println(format);
    
        timer.schedule(new SearchTimer(context),time);
        event.getServletContext().log("已经添加任务");
    }
    
    public void contextDestroyed(ServletContextEvent event){
        //在这里关闭监听器,所以在这里销毁定时器。
        timer.cancel();
        event.getServletContext().log("定时器销毁");
    }

    }

Servlet3.0提供@WebListener注解将一个实现了特定监听器接口的类定义为监听器,这样我们在web应用中使用监听器时,也不再需要在web.xml文件中配置监听器的相关描述信息了。
package Mail;

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.security.GeneralSecurityException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TimeZone;
import java.util.TimerTask;
import javax.servlet.ServletContext;

public class SearchTimer extends TimerTask {

    private static boolean isRunning = false;
    private ServletContext context = null;

    public SearchTimer(ServletContext context) {
        this.context = context;
    }

    @SuppressWarnings("deprecation")
    @Override
    public void run() {
        if (!isRunning) {
            isRunning = true;
            Check a=new Check();
            a.check();
            isRunning = false;
        } else {
            context.log("上一次任务执行还未结束");
        }
    } 
}

timer.schedule(new SearchTimer(context),time);
这一句将定时器设定在每天的0:0:0运行

先写到这,感兴趣的可以去好友生日提醒 看一看,不过这个项目还没完成,随时有可能访问不了。

Last modification:May 27th, 2019 at 06:10 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment