java的任務監聽器監聽任務


Java自帶的java.util.Timer類,這個類允許你調度一個java.util.TimerTask任務。

使用這種方式可以讓你的程序按照某一個頻度執行,但不能在指定時間運行。一般用的較少

 

 

監聽器類:

package com.tech.jin.listener;

import java.util.Timer;
import java.util.TimerTask;

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

import org.apache.log4j.Logger;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.tech.jin.task.OneTask;
import com.tech.jin.util.Const;

/**
 * 任務監聽器 需要配置在web.xml的listener中
 * @author Administrator
 *
 */
public class TaskListener implements ServletContextListener{

    private Logger logger = Logger.getLogger(TaskListener.class);
    private ServletContext context = null;
    private Timer timer = null;
    
    
    @Override
    public void contextDestroyed(ServletContextEvent event) {
        logger.info("TaskListener contextDestroyed...");
        timer.cancel();
        context = null;
    }

    @Override
    public void contextInitialized(ServletContextEvent event) {
        logger.info("TaskListener contextInitialized...");
        
        context = event.getServletContext();
        //如果使用spring框架,可將context放入到一個工具類中的常量,用來取到WebApplicationContext 
//        Const.WEB_APP_CONTEXT = WebApplicationContextUtils.getWebApplicationContext(context);
        
        logger.info("定時器開始初始化...");
        timer = new Timer();
        
        logger.info("定時任務OneTask創建...");
        TimerTask task = new OneTask(context);
        long period = 60*60*1000;//每隔1小時
        timer.schedule(task, 0, period);
        logger.info("定時任務OneTask已添加到任務調度...");
        
        //TODO
        
    }

}

 

任務類:

package com.tech.jin.task;

import java.util.Calendar;
import java.util.TimerTask;

import javax.servlet.ServletContext;

import org.apache.log4j.Logger;

public class OneTask extends TimerTask{

    private Logger logger = Logger.getLogger(OneTask.class);
    private ServletContext context = null;
    private static final int taskExcuteTime = 15;//15點鍾
    
    public OneTask(ServletContext context){
        this.context = context;
    }
    
    @Override
    public void run() {
        logger.info("OneTask run...");
        
        Calendar c = Calendar.getInstance();
        int currentHour = c.get(Calendar.HOUR_OF_DAY);//24小時制,取值0-24
        
        if(currentHour==taskExcuteTime){
            
            logger.info("任務開始...");
            
            try {
                
                doTask();//執行任務邏輯
                
            } catch (Exception e) {
                logger.error("任務執行異常:"+e);
            }
            
            logger.info("任務結束...");
            
        }
        
    }
    
    public void doTask() throws InterruptedException{
        logger.info("doTask");
        
        logger.info("context:"+context);
    }

}

 

另一種是相比於Timer的單線程,它是通過線程池的方式來執行任務的。

package com.tech.jin.listener;

import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

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

import org.apache.log4j.Logger;

import com.tech.jin.task.OneTask;

/**
 * 任務監聽器 需要配置在web.xml的listener中
 * @author Administrator
 *
 */
public class TaskListener implements ServletContextListener{

    private Logger logger = Logger.getLogger(TaskListener.class);
    private ServletContext context = null;
    private Timer timer = null;
    
    
    @Override
    public void contextDestroyed(ServletContextEvent event) {
        logger.info("TaskListener contextDestroyed...");
        timer.cancel();
        context = null;
    }

    @Override
    public void contextInitialized(ServletContextEvent event) {
        logger.info("TaskListener contextInitialized...");
        
        context = event.getServletContext();
        //如果使用spring框架,可將context放入到一個工具類中的常量,用來取到WebApplicationContext 
//        Const.WEB_APP_CONTEXT = WebApplicationContextUtils.getWebApplicationContext(context);
        
        //1.定時任務實現方式一
/*        logger.info("定時器開始初始化...");
        timer = new Timer();
        
        logger.info("定時任務OneTask創建...");
        TimerTask task = new OneTask(context);
        long period = 60*60*1000;//每隔1小時
        timer.schedule(task, 0, period);
        logger.info("定時任務OneTask已添加到任務調度...");*/
        
        //2.定時任務實現方式二 相比於Timer的單線程,它是通過線程池的方式來執行任務的
        Runnable r = new Runnable() {
            
            @Override
            public void run() {
                // TODO Auto-generated method stub
                
            }
        };
        long initialDelay = 0;//創建對象馬上執行
        long period = 1;//間隔一秒
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        service.scheduleAtFixedRate(r, initialDelay, period, TimeUnit.SECONDS);
        
        
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM