java监听器+quartz实现每天动态时间执行任务的功能
2017-04-11 09:59
821 查看
最近工作遇到一个需求:每天都要在某个时间执行一个任务 这个时间是 动态的 从数据库取的
比如今天是要在22点45分15秒执行一个任务 明天的这个时间是 23点45分11秒 以此类推 每天都会有一个动态的时间任务
网上找了很多资料 看了很多博客 ,此时深深感到国内it技术界的丑恶,好多博客都写的残全不全,浪费了我一天多的时间一直网上看资料 下demo跑起来都不是我想要的,经过思考终于解决这个需求,就是通过监听器实现每天固定时间的周期任务,然后通过quartz实现在指定的时间执行业务逻辑
核心代码:
为了看测试效果 我设置的监听器是每3分钟执行一次 生产中只要改成每天就好了
这是测试效果
demo 代码 完整项目我已经放到附件中 供大家下载
大小: 42.7 KB
TimingtaskPro.rar (1.7 MB)
下载次数: 80
查看图片附件
比如今天是要在22点45分15秒执行一个任务 明天的这个时间是 23点45分11秒 以此类推 每天都会有一个动态的时间任务
网上找了很多资料 看了很多博客 ,此时深深感到国内it技术界的丑恶,好多博客都写的残全不全,浪费了我一天多的时间一直网上看资料 下demo跑起来都不是我想要的,经过思考终于解决这个需求,就是通过监听器实现每天固定时间的周期任务,然后通过quartz实现在指定的时间执行业务逻辑
核心代码:
package com.task; import java.sql.SQLException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; import org.quartz.CronExpression; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.impl.StdSchedulerFactory; import com.db.DBUtil; import com.quartz.CountJob; import com.util.CommonUtil; public class TestTimer { static int count = 0; public static void showTimer() throws ClassNotFoundException, SQLException, ParseException { TimerTask task = new TimerTask() { @Override public void run() { ++count; System.out.println("时间=" + new Date() + " 执行了" + count + "次"); // 1次 // System.out.println("这里做业务逻辑"); String times = ""; try { times = DBUtil.getTimes(); //这个值就是数据库取的 很简单的取一个表 你们自己可以在本地建一个表来做测试 当然每天都会有不同的值 通过另外的项目生成 为了测试 我是自己手动改的数据库值 你们也可以这么做 如果只是想看效果的话 System.out.println("下次任务时间:" + times); } catch (ClassNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } Scheduler scheduler = null; try { scheduler = StdSchedulerFactory.getDefaultScheduler(); } catch (SchedulerException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { scheduler.start(); } catch (SchedulerException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (count >= 2) { System.out.println("说明这里是第二次以上的的定时任务:"+count); try { scheduler.shutdown(); //关闭之前的调度任务 } catch (SchedulerException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } //重新开启任务 try { scheduler = StdSchedulerFactory.getDefaultScheduler(); } catch (SchedulerException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { scheduler.start(); } catch (SchedulerException e) { // TODO Auto-generated catch block e.printStackTrace(); } //开启新的调度任务 JobDetail jd = new JobDetail("test"+count, "test_group"+count, CountJob.class); CronTrigger ct = new CronTrigger("test"+count, "test_group"+count); // 你修改下面的 表达式 就能满足了 // 时间格式: <!-- s m h d m w(?) y(?) -->, 分别对应: 秒>分>小时>日>月>周>年 try { // SimpleDateFormat sdf = new // SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // Date date = sdf.parse(times); SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); Date dateSFM = sdf.parse(times); Calendar calendarSFM = Calendar.getInstance(); calendarSFM.setTime(dateSFM); // System.out.println("时:"+calendar.get(Calendar.HOUR_OF_DAY)+"分:"+calendar.get(Calendar.MINUTE) // +"秒:"+calendar.get(Calendar.SECOND)); String cron = CommonUtil.makeDailyTriggerCron( calendarSFM.get(Calendar.HOUR_OF_DAY), calendarSFM.get(Calendar.MINUTE), calendarSFM.get(Calendar.SECOND)); ct.setCronExpression(cron); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { scheduler.scheduleJob(jd, ct); } catch (SchedulerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { JobDetail jd = new JobDetail("test", "test_group", CountJob.class); CronTrigger ct = new CronTrigger("test", "test_group"); // 你修改下面的 表达式 就能满足了 // 时间格式: <!-- s m h d m w(?) y(?) -->, 分别对应: 秒>分>小时>日>月>周>年 try { // SimpleDateFormat sdf = new // SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // Date date = sdf.parse(times); SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); Date dateSFM = sdf.parse(times); Calendar calendarSFM = Calendar.getInstance(); calendarSFM.setTime(dateSFM); // System.out.println("时:"+calendar.get(Calendar.HOUR_OF_DAY)+"分:"+calendar.get(Calendar.MINUTE) // +"秒:"+calendar.get(Calendar.SECOND)); String cron = CommonUtil.makeDailyTriggerCron( calendarSFM.get(Calendar.HOUR_OF_DAY), calendarSFM.get(Calendar.MINUTE), calendarSFM.get(Calendar.SECOND)); ct.setCronExpression(cron); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { scheduler.scheduleJob(jd, ct); } catch (SchedulerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }; // long delayTime = 24 * 60 * 60 * 1000; // 每24个小时执行一次 long delayTime = 3 * 60 * 1000; // 每分钟执行一次 Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int day = calendar.get(Calendar.DAY_OF_MONTH);// 每天 calendar.set(year, month, day, 19, 35, 30); // 每天中午12点执行 // calendar.set(year, month, day, calendar.get(Calendar.HOUR_OF_DAY), // calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND)); Date date = calendar.getTime(); Timer timer = new Timer(); System.out.println(date); // int period = 2 * 1000; // 每天的date时刻执行task,每隔2秒重复执行 // timer.schedule(task, date, period); // 每天的date时刻执行task, 仅执行一次 timer.schedule(task, date, delayTime); } }
package com.quartz; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class CountJob implements Job { public void execute(JobExecutionContext arg0) throws JobExecutionException { System.out.println("我就是具体业务任务啊 ,看到我说明任务执行了!"+ new Date()); } }
为了看测试效果 我设置的监听器是每3分钟执行一次 生产中只要改成每天就好了
这是测试效果
demo 代码 完整项目我已经放到附件中 供大家下载
大小: 42.7 KB
TimingtaskPro.rar (1.7 MB)
下载次数: 80
查看图片附件
相关文章推荐
- java中实现定时任务每天规定时间执行任务一次
- 关于Java Web 使用Spring中使用Quartz(定时调用、实现固定时间执行), 触发定时器(执行某些任务)的实例
- java 定时器,固定某个时间执行(Spring+Quartz实现定时任务的配置方法)
- quartz实现每周一至周五 非法定节假日 每天9:30-11:30,13:00-15:00执行定时任务
- oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。
- SpringCloud(第 010 篇)简单 Quartz-Cluster 微服务,支持集群分布式,并支持动态修改 Quartz 任务的 cronExpression 执行时间
- Java Timer定制每天特定时间执行任务
- Spring+Quartz 从数据库中获取定时任务和定时时间,动态实现对定时任务的增删改查
- quartz实现每周一至周五 非法定节假日 每天9:30-11:30,13:00-15:00执行定时任务
- Spring+Quartz 从数据库中获取定时任务和定时时间,动态实现对定时任务的增删改查
- Spring+Quartz 从数据库中获取定时任务和定时时间,动态实现对定时任务的增删改查
- oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。
- 【 Quartz】使用 JobListener (任务监听器可实现) 我想在一个任务执行后在执行第二个任务怎么办呢
- Java定时任务:利用java Timer类实现定时执行任务的功能
- Java之——实现每天定时执行任务
- [转]oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。
- Quartz实现JAVA定时任务的动态配置
- Quartz实现JAVA定时任务的动态配置的方法
- oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。
- Java—实现每天定时执行任务