Java之几种定时器的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40931184/article/details/81116533

没有去仔细研究这两种定时器的API,会使用及能在项目中应用即可;

import org.quartz.CronExpression;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

一、JobDetail的用法

public void startTasl(ServletContext context, String jobName, String jobGroup,
         SInterfacePara sInterP, String cexpReg) throws ParseException, SchedulerException {

 //创建一个jobDetail对象=>jobName:自定义工作名称;jobGroup自定义工作组名称;启动的类(须实现Job接口)
        JobDetail jobDetail = new JobDetail(jobName, jobGroup, SimpleJob.class);

//将所需对象参数放在此Map集合中,后续使用可取出(map.get("key"))
        jobDetail.getJobDataMap().put("key", key);

//将servletContext 放置在Map中;
        jobDetail.getJobDataMap().put("context", context);

//创建一对触发器对象;
        CronTrigger cronTrigger = new CronTrigger("trigger" + jobName, "tgroup" + jobName);

 //创建定时任务表达式,将表达式写入其中(此表达式的书写格式,最下面会有详细介绍);
        CronExpression cexp = new CronExpression("表达式");// ①-2:定义Cron表达式
        cronTrigger.setCronExpression(cexp);// ①-3:设置Cron表达式
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        scheduler.scheduleJob(jobDetail, cronTrigger);
        scheduler.start();

    }

二、实现 StatefulJob 接口

import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;

 public static void addJob(Task task,ServletContext context) throws SchedulerException, ParseException, InstantiationException, IllegalAccessException, ClassNotFoundException {
           Scheduler sched = sf.getScheduler();
           Job imp = (Job) Class.forName(task.getClassname()).newInstance();//具体的哪个类
           JobDetail jobDetail = new JobDetail(task.getId(), JOB_GROUP_NAME, imp.getClass());//任务名,任务组,任务执行类
           jobDetail.getJobDataMap().put("ServletContext", context);
           //触发器
           Trigger trigger = null;
           if(task.getType()==1){
              trigger = getSimpleTrigger(task);
           }else{
              trigger = getCronTrigger(task);
           }
           sched.scheduleJob(jobDetail,trigger);
           //启动
           if(!sched.isShutdown()){
              sched.start();
           }
       }

public static Trigger getSimpleTrigger(Task task){
        SimpleTrigger trigger = new SimpleTrigger(task.getId(),JOB_GROUP_NAME);
        if(!(task.getStartTime().trim().equals(""))){
            trigger.setStartTime(parseDateString(task.getStartTime()));
        }else{
            trigger.setStartTime(new Date());
        }
        if(!(task.getEndTime().trim().equals(""))){
            trigger.setEndTime(parseDateString(task.getEndTime()));
        }
        if(task.getRepeatCount().equals("-1")){
            trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
        }else{
            trigger.setRepeatCount(Integer.parseInt(task.getRepeatCount()));
        }
        trigger.setRepeatInterval(Long.parseLong(task.getRepeatInterval())*1000L);
        return trigger;
    }
  
    public static Trigger getCronTrigger(Task task){
        CronTrigger trigger =  new CronTrigger(task.getId(), TRIGGER_GROUP_NAME);//触发器名,触发器组
        try {
            trigger.setCronExpression(task.getContent());
        } catch (ParseException e) {
            e.printStackTrace();
        }//触发器时间设定
        return trigger;
    }

定时的那个类要实现StatefulJob接口

三、线程(自个编写一个线程,在web.xml中启动时优先),下面有个案例,可套用;

1、web.xml添加配置

  <servlet-name>MyServlet</servlet-name>  
     <servlet-class>my.person.engine.quartz.MyServlet</servlet-class>  
     <load-on-startup>0</load-on-startup>
  </servlet>  
 
  <servlet-mapping>  
     <servlet-name>MyServlet</servlet-name>  
     <url-pattern>/</url-pattern>  
  </servlet-mapping> 

2、编写一个servlet 继承HttpServlet, 初如化时去启动线程

public void init(ServletConfig config) throws ServletException {
        super.init(config);
        logger.info("初始化了吗");
        try {
            TestSubmit submit = new TestSubmit ();
            submit.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

public class TestSubmit  extends Thread {

public void run() {

     //利用while循环不断的执行;

          代码块    注:如果这里执行周期,必须保证线程不会起冲突,否则可能引起数据错误;

    }

}

四、在监听中注册定时,继承TimerTask;

1、先在web.xml中进行注册;

<listener id="Listener_3">
        <listener-class>
            pde.ams.MobileContextListener
        </listener-class>
    </listener>   

2、继承上下文监听

public class MobileContextListener implements ServletContextListener {
    private static Logger logger = Logger.getLogger(MobileContextListener.class);
    private Timer timer = null;
    
    public void contextDestroyed(ServletContextEvent arg0) {
        timer.cancel();    
        ProxoolFacade.shutdown();    //连接池关闭
    }

    public void contextInitialized(ServletContextEvent arg0){
        timer = new Timer(true);                        //定时器已启动        
//        long delay = 5*1000;                            //5秒后执行
        long delay = 0;
//        long interval = 5*1000 ;                    //定时为 每5秒执行一次定时
        long interval=13*1000;//实时发送
        try {
            timer.schedule(new DaiBanSendTaskJob(arg0.getServletContext()), delay, interval);//已经将全文索引添加任务调度表
        } catch (Exception e) {
            timer.cancel();    
        }    
    }
}

3、继承TimerTask 类

public class DaiBanSendTaskJob extends TimerTask {

public void run() {

猜你喜欢

转载自blog.csdn.net/weixin_40931184/article/details/81116533