Timer类实现定时调度

使用timer类定时调度,生成文件

timer类需要通过监听器来初始化定时器,web容器在运行时自动加载

  1. 先写个定时任务类CreateFileTask,继承至TimerTask,需要重写run()方法

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.TimerTask;
public class CreateFileTask extends TimerTask {
    //重写的run方法
    @Override
    public void run() {
        //写入的文件数据
        String content="";
        //文件路径
        String path = File.separator + "xxxx";
        //文件名称
        String fileName ="xxx.avl";
        
        //表示是否重新写入,为true表示重头开始写,为false时文件存在则接着文件内容尾部写入数据
        boolean writeflag = false;
        /**
         * 此处省略获取数据内容代码
         * 。。。。
         * byte[] b1 = {0x01};//以16进制“01”作为内容分隔符
         *String b1Str = new String(b1);
         */
        //执行的任务
        this.writerFileDate(content, getCreateFile(path, fileName), writeflag);
    }
    
    /**
     * 创建文件路径,并获取文件名
     * @return
     */
    public String getCreateFile(String path,String fileName){
        File file = new File(path+fileName);
        if(!file.exists()){//文件不存在
            file.getParentFile().mkdirs();//创建文件目录
        }
        return path+fileName;
    }
    
    /**
     * 数据写入到文件
     * @param content
     */
    public void writerFileDate(String content,String fileName,boolean writeflag){
        BufferedWriter bw = null;
        try {
            bw = new BufferedWriter(new OutputStreamWriter(
                    new FileOutputStream(fileName,writeflag)));
            bw.write(content);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                if(bw!=null){
                    bw.close();// 关闭输出流
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
    }
}


2.写一个监听器CreateFileListener类,实现ServletContextListener,重写contextDestroyed,contextInitialized两个方法

com.test.listener
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class CreateFileListener implements ServletContextListener  {
    private Timer timer;
    /**
     * 销毁
     */
    public void contextDestroyed(ServletContextEvent arg0) {
        // TODO Auto-generated method stub
        
    }
    /**
     * 初始化定时器
     * web 程序运行时候自动加载 
     */
    public void contextInitialized(ServletContextEvent arg0) {
        // TODO Auto-generated method stub
        /**   
         * 设置一个定时器   
         */
        timer = new Timer();
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);    
        int month = calendar.get(Calendar.MONTH);    
        int day =calendar.get(Calendar.DAY_OF_MONTH);//每天    
        //定制每天的1:00:00执行
        calendar.set(year, month, day, 12, 46, 00);  
        Date taskDate = calendar.getTime();
        //重复执行时间:每隔60秒重复执行
        int period = 60*1000;
        //注意:schedule没有period时是不会重复执行的,即只执行一次,详细内容参照api文档
        timer.schedule(new CreateFileTask(arg0.getServletContext()) , taskDate, period);
    }


3.web文件配置监听器

代码:

<!-- 加载spring监听器 -->

<!-- 加载spring监听器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener<stener-class>
    <stener>
    <listener>
        <listener-class>com.zzq.survey.listener.CardPayReportTaskListener</listener-class>
    <stener>

注:在启动tomcat的时候,就会自动加载web容器,会立马自动执行一次timer定时调度。