`
zqb666kkk
  • 浏览: 733837 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

java监听器+quartz实现每天动态时间执行任务的功能

 
阅读更多
最近工作遇到一个需求:每天都要在某个时间执行一个任务 这个时间是 动态的 从数据库取的
比如今天是要在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
0
2
分享到:
评论
7 楼 zqb666kkk 2015-04-28  
endual 写道
zqb666kkk 写道
endual 写道
这种demo么哪里要baidu啊,也不用怪国内的风气不好,怪自己搜索能力查。

推荐你 github.com,你去查下,都是完整的demo

很多需求都跟我的不一样的


需求或多或少不一样的,你看下这个demo,也是动态执行的,要是可以改进更好。

https://github.com/vijayrawatsan/QuartzDynamicScheduling

另外一篇 http://blog.csdn.net/zlxdream815/article/details/8177574
我觉得也可以参考。

我印象中 TimerTask 能不用就不要用。

可以参考 但是没有那种完整的可以实现我需求的 demo
就是说没有我那种业务需求的demo 
6 楼 longhua2003 2015-04-27  
楼主,写的不错
5 楼 endual 2015-04-24  
zqb666kkk 写道
endual 写道
这种demo么哪里要baidu啊,也不用怪国内的风气不好,怪自己搜索能力查。

推荐你 github.com,你去查下,都是完整的demo

很多需求都跟我的不一样的


需求或多或少不一样的,你看下这个demo,也是动态执行的,要是可以改进更好。

https://github.com/vijayrawatsan/QuartzDynamicScheduling

另外一篇 http://blog.csdn.net/zlxdream815/article/details/8177574
我觉得也可以参考。

我印象中 TimerTask 能不用就不要用。
4 楼 zqb666kkk 2015-04-24  
endual 写道
这种demo么哪里要baidu啊,也不用怪国内的风气不好,怪自己搜索能力查。

推荐你 github.com,你去查下,都是完整的demo

很多需求都跟我的不一样的
3 楼 zqb666kkk 2015-04-24  
endual 写道
这种demo么哪里要baidu啊,也不用怪国内的风气不好,怪自己搜索能力查。

推荐你 github.com,你去查下,都是完整的demo

有吗? 要不你帮我找个一个看看 贴出下载地址我看看
2 楼 endual 2015-04-24  
这种demo么哪里要baidu啊,也不用怪国内的风气不好,怪自己搜索能力查。

推荐你 github.com,你去查下,都是完整的demo
1 楼 foolishdault 2015-04-24  
也可以使用系统的定时调度执行,你只关心业务逻辑

相关推荐

    Spring mvc + Mybatis + quartz + swagger 定时任务管理[新增、编辑、删除、修改]

    4. 当触发条件满足时,Quartz执行相应的Job,同时记录任务的运行日志,这部分日志信息也会被写入到数据库中。 5. 管理员可以随时查看任务列表,包括当前状态、最近运行情况等,还可以通过接口停止或启动任务。 通过...

    定时任务quartz实现分组串行并行动态配置

    `Job`是执行任务的基本单元,`Trigger`则决定了何时触发Job。Quartz提供了`Scheduler`来管理和调度这些Job和Trigger。`JobGroup`是Job的集合,可以用来组织和管理相关的Job。 要实现动态配置,我们需要关注以下几个...

    java定时任务quartz的基本实现

    Quartz允许添加作业监听器和触发器监听器,以便在任务执行前后进行日志记录、统计或其他操作。 Quartz提供的灵活性和强大功能使其成为Java定时任务的理想选择。通过理解上述基本概念和操作,你可以创建复杂的定时...

    springboot+quartz集群:通过动态配置调度dubbo接口/http接口代码实现

    6. 配置Quartz监听数据库变化,当有新的任务配置时,自动创建或更新Job。 总的来说,这个项目结合了多种技术,实现了任务调度与业务逻辑的解耦,提供了高可用和灵活的定时任务解决方案。通过动态配置,系统能够适应...

    quartz动态任务管理

    1. **Job类**:这是实际执行任务的类,实现了`org.quartz.Job`接口,包含`execute(JobExecutionContext context)`方法,这是执行任务的入口点。 2. **Trigger类**:用于定义何时触发作业。常见的触发器类型有...

    java-springboot-quartz-定时任务.zip

    SpringBoot作为轻量级的框架,简化了Spring应用的初始搭建以及开发过程,而Quartz则是一个功能强大的作业调度框架,可以精确地控制任务的执行时间和频率。 在SpringBoot项目中集成Quartz,首先需要引入相关的依赖。...

    详解Spring整合Quartz实现动态定时任务

    * Quartz框架提供了多种监控和管理工具,包括Quartz管理控制台和Quartz监听器等,用于监控和管理定时任务的执行情况。 * 在Spring项目中使用Quartz框架实现定时任务需要注意事务处理和并发控制问题,防止定时任务的...

    quartz定时程序 java

    Quartz是一款开源的作业调度框架,它在Java应用程序中用于执行定时任务。这款库以其强大的功能和灵活性而闻名,能够帮助开发者实现复杂的时间调度需求。Quartz的核心是Job(作业)和Trigger(触发器),它们共同协作...

    java quartz定时任务

    4. **监听器**:Quartz提供了多种监听器接口,如JobListener、TriggerListener,可以用来监听任务的开始、结束、执行异常等事件。 5. **错误处理**:在编写Job时,应考虑到可能出现的异常情况,通过try-catch结构...

    Quartz1.7 动态添加、修改和删除定时任务(非spring集成版)

    Quartz是一款功能强大的开源作业调度框架,用于在Java应用程序中创建和管理定时任务。1.7版本是其历史上的一个稳定版本,提供了丰富的API和功能,使得开发者能够灵活地实现定时任务的动态管理,包括添加、修改和删除...

    quartz动态从数据库获取时间定时

    在"quartz动态从数据库获取时间定时"的场景中,我们可以理解为Quartz的任务执行时间不是硬编码在程序中,而是从数据库中动态获取,这提供了更大的灵活性和可配置性。 首先,让我们来详细了解一下Quartz的核心概念:...

    java_Quartz计划任务配置

    - Quartz提供了各种监听器,如JobListener、TriggerListener和SchedulerListener,可以监控任务的执行状态,实现定制化的日志记录或异常处理。 在实际项目中,使用Quartz可以方便地管理周期性任务,如数据同步、...

    Java Quartz开发

    4. **Calendar**:不同于Java的util.Calendar,Quartz的Calendar是一个时间点集合,用于排除或包含某些特定时间点,例如在节假日不执行任务。 **三、Quartz的使用** 使用Quartz时,首先需要创建JobDetail对象,...

    11-Spring+Quartz定时任务最简集群版1

    6. `quartz`: Quartz库,是Java平台上的一个开源作业调度框架,用于创建和执行定时任务。 集群版的实现意味着,当有多个实例运行时,可以有效地管理和同步任务,避免重复执行。在Spring中集成Quartz,通常会通过`...

    利用Quartz.net实现任务调度

    3. 作业监听器和触发器监听器:可以添加自定义的监听器来监听作业执行和触发器触发事件,方便日志记录和监控。 4. 回调函数:Quartz.NET提供`JobExecutionException`处理,当作业执行过程中出现异常时,可以通过回...

    Quartz 定时任务web使用

    Quartz 是一个开源的作业调度框架,常用于Java应用程序中实现定时任务的管理。它提供了丰富的API和功能,使得开发者可以灵活地定义和控制任务的执行。本篇将重点介绍如何在Web环境中集成并使用Quartz,以及相关的...

    使用Quartz实现定时功能

    Quartz提供了强大的调度能力,可以满足不同场景的需求,比如定时执行任务、周期性任务等。 #### 二、Quartz核心概念 1. **Job(作业)**:这是Quartz中的核心概念之一,它代表了要执行的任务。一个`Job`实例必须...

    spring添加触发器+quartz

    Spring 和 Quartz 的集成是实现定时任务执行的一种常见方式。Quartz 是一个强大的、完全开源的作业调度框架,它可以被用来创建、调度和执行各种类型的任务。以下是对如何在 Spring 中添加触发器并结合 Quartz 实现...

    java 定时任务 quartz

    Quartz的核心在于其灵活的任务调度机制,它能够与Java应用程序无缝集成,使得开发者可以方便地创建、管理和执行任务。 在Quartz中,任务被称为Job,而调度规则被称为Trigger。Job是实际执行的工作单元,它实现了`...

Global site tag (gtag.js) - Google Analytics