• 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);
            
            
        }
    
    }
  • 相关阅读:
    Spring AOP 实现原理
    Spring Aop实现方式总结
    Spring Aop重要概念介绍及应用实例结合分析
    Spring Aop
    常见的排序算法
    MINA2.0原理
    Java和Tomcat类加载机制
    Java 8 新特性概述
    Java类加载机制深度分析
    jetty之建立多Connector
  • 原文地址:https://www.cnblogs.com/jinzhiming/p/6265249.html
Copyright © 2020-2023  润新知