`
zqb666kkk
  • 浏览: 724734 次
  • 性别: 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  
也可以使用系统的定时调度执行,你只关心业务逻辑

相关推荐

    Java课程实验 Spring Boot 任务管理(源代码+实验报告)

    Quartz提供了更多的调度策略、任务监听器等功能。 以上是一些在Spring Boot中实现任务管理的常见方案。你可以根据具体需求选择合适的方式来执行任务,并通过配置和注解来定制任务的执行时间和逻辑。

    Java中使用Quartz进行任务调度常用操作

    包含Java中使用Quartz进行任务调度常用操作:设置开始时间、设置结束时间、简单触发器、Cron触发器、作业监听器、启动多个作业、查看所有作业、手动触发作业、传递参数、取消/删除作业、作业出错时自动再执行等代码...

    Quartz开源作业调度库-其他

    Quartz是功能强大的开源作业调度库,几乎可以集成到任何Java应用程序中-从最小的独立应用程序到最大的电子商务系统。Quartz可用于创建简单或复杂的计划,以执行...3、Quartz附带了许多“工厂内置”的插件和监听器。

    Spring.3.x企业应用开发实战(完整版).part2

    12.2.4 添加Hibernate事件监听器 12.2.5 使用原生Hibernate API 12.2.6 使用注解配置 12.2.7 事务处理 12.2.8 延迟加载的问题 12.3 在Spring中使用myBatis 12.3.1 配置SqlMapClient 12.3.2 在Spring配置myBatis ...

    Spring3.x企业应用开发实战(完整版) part1

    12.2.4 添加Hibernate事件监听器 12.2.5 使用原生Hibernate API 12.2.6 使用注解配置 12.2.7 事务处理 12.2.8 延迟加载的问题 12.3 在Spring中使用myBatis 12.3.1 配置SqlMapClient 12.3.2 在Spring配置myBatis ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    任务规划 2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 2.7.1. 一些变化 2.7.1.1. Jar包 2.7.1.2. XML配置 2.7.1.3. Deprecated的类和方法 2.7.1.4. Apache OJB 2.7.1.5. iBatis 2.8. 更新的样例应用 2.9...

    Spring 2.0 开发参考手册

    2.6.1. 动态语言支持 2.6.2. JMX 2.6.3. 任务规划 2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 2.7.1. 一些变化 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. 控制反转容器 3.1. 简介 ...

    Spring中文帮助文档

    2.6.1. 动态语言支持 2.6.2. 增强的测试支持 2.6.3. JMX 支持 2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. ...

    spring chm文档

    2.6.1. 动态语言支持 2.6.2. JMX 2.6.3. 任务规划 2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 2.7.1. 一些变化 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. 控制反转容器 3.1. 简介 ...

    Spring API

    2.6.1. 动态语言支持 2.6.2. 增强的测试支持 2.6.3. JMX 支持 2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 (Tiger) 支持 2.7. 移植到Spring 2.5 2.7.1. 改变 2.8. ...

    Spring in Action(第二版 中文高清版).part2

    10.3.1 创建消息监听器 10.3.2 编写纯POJO MDP 10.4 使用基于消息的RPC 10.4.1 引入Lingo 10.4.2 输出服务 10.4.3 代理JMS 10.5 小结 第11章 Spring和EJB 11.1 在Spring中置入EJB 11.1.1 代理会话Bean...

    Spring in Action(第二版 中文高清版).part1

    10.3.1 创建消息监听器 10.3.2 编写纯POJO MDP 10.4 使用基于消息的RPC 10.4.1 引入Lingo 10.4.2 输出服务 10.4.3 代理JMS 10.5 小结 第11章 Spring和EJB 11.1 在Spring中置入EJB 11.1.1 代理会话Bean...

    Spring in Action(第2版)中文版

    10.3.1创建消息监听器 10.3.2编写纯pojomdp 10.4使用基于消息的rpc 10.4.1引入lingo 10.4.2输出服务 10.4.3代理jms 10.5小结 第11章spring和ejb 11.1在spring中置入ejb 11.1.1代理会话bean(ejb2.x) 11.1.2...

Global site tag (gtag.js) - Google Analytics