使用Timer+servletListener实现web服务的任务调度

  • 首先是调度任务类
package timer;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class AlarmLogTask {
    /*
     * 按天执行常量数据
     */
    public static long preiod = 24*60*60*1000;

    // 周期任务执行方法
    public void doTask(){
        // TODO 执行周期任务
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        //生成第二天的数据库
        calendar.add(Calendar.DAY_OF_MONTH, 1); 
        String dateString = new SimpleDateFormat("yyyyMMdd_hhmmss").format(calendar.getTime());
        /*
         * add by wangxy 判断今天是不是月末,月末创建下一个月的log表
         */
        excuteSql(dateString);

    }   
    public boolean excuteSql(String dateString){
        Connection connection = null;
        Statement stmt = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/alarmlog", "root",
                    "root");

            String sql = "CREATE TABLE `alarmlog"
                    + dateString
                    + "` ("
                    + "  `id` int(50) NOT NULL AUTO_INCREMENT,"
                    + "  `status` int(2) DEFAULT NULL COMMENT '调用状态,0-成功',"
                    + "  `content` varchar(255) DEFAULT NULL COMMENT '告警内容',"
                    + "  `transferTime` datetime DEFAULT NULL COMMENT '调用服务时间',"
                    + "  `level` int(2) DEFAULT NULL COMMENT '告警级别',"
                    + "  `alarmTime` datetime DEFAULT NULL COMMENT '告警时间',"
                    + "  PRIMARY KEY (`id`)"
                    + ") ENGINE=InnoDB DEFAULT CHARSET=utf8; ";

            stmt = connection.createStatement();
            stmt.execute(sql);
            System.out.println("excute success");
        } catch (Exception e) {
            return false;
        } finally {
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            System.out.println("excute finally");
        }
        return true;

    }

}
  • 任务写好了之后,我们开始写ContextListener。
package listener;

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import timer.AlarmLogTask;

public class ScheduleListener implements ServletContextListener {
    public static long preiod = 5000;
    public static Timer timer = null;
    public void contextDestroyed(ServletContextEvent event) {
        System.out.println("listener destory start");
        timer.cancel();
        System.out.println("listener destory end");
    }

    public void contextInitialized(ServletContextEvent event) {
        System.out.println("listener init start");
        final AlarmLogTask alarmLogTask = new AlarmLogTask();
        //服务启动时,首次去检测是否有当月的log表创建。
        alarmLogTask.doTask();
        if(timer!=null){
            timer = new Timer();
        }
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 15);
        calendar.set(Calendar.MINUTE, 20);
        calendar.set(Calendar.SECOND, 40);
        Date date = calendar.getTime();
        if(date.before(new Date())){
            calendar.add(Calendar.DAY_OF_MONTH, 1);
            date = calendar.getTime();
        }
        Timer timer = new Timer();
        TimerTask task = new TimerTask(){
            @Override
            public void run() {
                alarmLogTask.doTask();
            }
        };
        timer.schedule(task, date, preiod); 
        System.out.println("listener init end");

    }

}
  • web.xml中进行配置
  <listener>
    <listener-class>listener.ScheduleListener</listener-class>
  </listener>

这样就成功的设置了一个在服务启动时开启的调度任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值