- 浏览: 414459 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
Glogo:
楼主您好,我在试验您的代码的时候发现新开的三个子线程并没有一直 ...
java 高并发 ReentrantLock -- 可重入的锁 -
univasity:
最近发觉也被限速了,投诉一下就好一会~~ 看来明天又要和电信M ...
ADSL上网速度慢 都是帐号限速惹的祸 -
liuyuanhui0301:
java 高并发 ReentrantLock -- 可重入的锁 -
dang_java:
呵.很好的说明文档.
JXTA技术与应用发展 -
helloqidi:
谢谢,学习了
SQL中exists和in的区别
Java 中已经有一个 timer 类可以用来进行执行计划,定时任务。我们所要做的只是继承 java.util.TimerTask 类。如下所示:
package com.yourcompany.scheduling; import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class ReportGenerator extends TimerTask { public void run() { System.out.println("Generating report"); //TODO generate report } } class MainApplication { public static void main(String[] args) { Timer timer new Timer(); Calendar date = Calendar.getInstance(); date.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY); date.set(Calendar.HOUR, 0); date.set(Calendar.MINUTE, 0); date.set(Calendar.SECOND, 0); date.set(Calendar.MILLISECOND, 0); // Schedule to run every Sunday in midnight timer.schedule(new ReportGenerator(), // TimerTask date.getTime(), // Timer 1000 * 60 * 60 * 24 * 7 // delay) }; 这里有几个问题,我们的类继承了TimerTask ,而timerTask 也是实现了 java.lang.Runnable 接口。我们所要做的只是在我们自己的类里重置 run() 方法。所以我们的TimerTask类其实是一种线程,但线程的调度往往不是按照我们希望来实现的,因为一些垃圾收集等原因,我们计划的时间点,却没有执行必要的任务。这样会产生一些问题。虽然,Timer 类也提供了scheduleAtFixedRate() 方法用来在垃圾收集后能够快速的追上任务进度,但这个不一定是我们所需要的。特别是在 一些 J2EE 服务器上 Timer 是无法控制的,因为它不在容器的权责范围内。另外的,这个任务调度也缺乏一些企业级所需要的 特殊 日期定制的功能,以及修改,查找任务的功能。 这里我们要介绍的是一个开源项目:Quartz . Quartz 定义了两种 基本接口 Job 和 Trigger . 看名字也就知道,我们的任务必须实现 Job, 我们的时间触发器定义在 Trigger 内。 看一个例子也许能更快的了解他的使用方法:package com.yourcompany.scheduling; import org.quartz.*; public class QuartzReport implements Job { public void execute(JobExecutionContext cntxt) //必须实现的方法 throws JobExecutionException { System.out.println("Generating report - " + cntxt.getJobDetail().getJobDataMap().get("type")); //TODO Generate report } public static void main(String[] args) { try { SchedulerFactory schedFact new org.quartz.impl.StdSchedulerFactory(); Scheduler sched = schedFact.getScheduler(); sched.start(); JobDetail jobDetail = new JobDetail("Income Report", // 任务名 "Report Generation", // 任务组 QuartzReport.class //任务执行的类 ); jobDetail.getJobDataMap().put("type","FULL"); CronTrigger trigger new CronTrigger( "Income Report", //触发器名 "Report Generation" //触发器组 ); trigger.setCronExpression( // 触发器时间设定 "0 0 12 ? * SUN" ); sched.scheduleJob(jobDetail, trigger); // 执行任务 } catch (Exception e) { e.printStackTrace(); } 这里面我们可以看到,当我们定义了任务执行 QuartzReport 类后,需要定一个Scheduler类用来执行计划任务。 一个JobDetail 类来描述这个任务的信息,包括任务信息,任务所在组,任务执行的类。 然后还要定义一个 触发器,类似的也包括触发器名,触发器所在组,触发器触发时间设定。 最后是调度器Scheduler类执行计划任务。基本上一个计划任务执行的流程就完成了。 当然,我们还看到了上面红色代表的内容,这些内容主要是提供在job方法执行的时候所需要的参数的提供。这里使用了JobDataMap 类,它其实就是实现了map的特殊应用的一个类,使用方法与Map 很相似。我们可以用 put() 输入参数。在Job类中使用cntxt.getJobDetail()。getJobDataMap()。get("type") 方法获取输入的参数的值。这里的cntxt 是 JobExecutionContext .就是包含任务执行上下文的一个信息类。这样我们的一个基本的任务执行就可以搞定了。 触发器有两类:SimpleTrigger andCronTrigger. .SimpleTrigger主要提供了跟 java.util.Timer 类相似的功能……你可以在里面定义 任务的起始时间,终止时间,任务的执行次数,任务执行的中间间隔 . 而 CronTrigger类主要提供了更高级的任务调度时间设置,例如 每个星期天的早上7点 . CronTrigger的时间设置说明在最后来介绍。 下面我们介绍一下在 J2EE 环境下如何来使用 Quartz . 首先,我们要配置 web.xml ,添加 一下内容,主要是Quartz 的初始化, <servlet> <servlet-name>QuartzInitializer</servlet-name> <display-name>Quartz Initializer Servlet</display-name> <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> 然后还要有一个Quartz 的配置文件 quartz.properties 放置在 WEB-INF/classes目录下面。StdScheduleFactory()会读取它。配置如下# # Configure Main Scheduler Properties # org.quartz.scheduler.instanceName = TestScheduler org.quartz.scheduler.instanceId = one # # Configure ThreadPool # org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount = 5 org.quartz.threadPool.threadPriority = 4 # # Configure JobStore # org.quartz.jobStore.misfireThreshold = 5000 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore 这里我们使用的 RAMJobStore 存储方式,这样如果我们的web服务器重启的话,我们所有未执行的任务信息都回丢失。当然,我们也有另外的选择,我们可以把这样的信息存储在数据库内,就是使用 JDBCJobStoreTX # # Configure ThreadPool # org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate org.quartz.jobStore.dataSource = myDS org.quartz.jobStore.tablePrefix = QRTZ_ # # Configure Datasources # org.quartz.dataSource.myDS.driver = org.postgresql.Driver org.quartz.dataSource.myDS.URL = jdbc:postgresql:dev org.quartz.dataSource.myDS.user = dejanb org.quartz.dataSource.myDS.password = org.quartz.dataSource.myDS.maxConnections 5 附:cronExpression配置说明
Cron 的小小说明
|
发表评论
-
深入JVM锁机制
2011-09-19 01:00 939目前在Java中存在两种 ... -
java 正则表达式 非捕获组(特殊构造)Special Constructs(Non-Capturing)
2011-06-20 23:15 1592针对Java API文档中的正则表达式关于特殊构造(非捕获组) ... -
Java文件映射[mmap]揭秘
2011-06-08 20:10 1092前言 相信现在 ... -
原创 java的Mmap二三事
2011-06-08 19:46 1151转自 :http://blog.csdn.net/kabini ... -
java 安全沙箱模型详解
2011-04-18 16:29 905起到第一道安全保障作 ... -
非阻塞算法-ReentrantLock代码剖析之ReentrantLock.lock
2011-04-15 13:59 1046ReentrantLock是java.util.concurr ... -
CyclicBarrier与CountDownLatch、栅栏与计数器
2011-04-15 10:39 1424在多线程设计中,我猜常常会遇到线程间相互等待以及某个线程等待1 ... -
Java KeyStore
2011-04-13 17:17 1423简介Java自带的keytool工具是个密钥和证书管理工具。它 ... -
Security Managers and the JavaTM 2 SDK
2011-04-12 13:37 737The original Link : http://do ... -
Something about SecurityManager
2011-04-12 13:33 745The Java Security was made up o ... -
Using the Java SecurityManager with Tomcat
2011-04-12 13:30 958Why use a SecurityManager? The ... -
Java安全管理器(Security Manager)(
2011-04-11 14:54 853转载自: http://blog.sina.com.cn/s/ ... -
Java对象的强、软、弱和虚引用(1)
2011-04-01 08:44 769本文介绍Java对象的强 ... -
Java对象的强引用、软引用、弱引用和虚引用
2011-04-01 08:39 868在JDK1.2以前的版本中, ... -
java 高并发 ReentrantLock -- 可重入的锁
2011-03-30 08:09 2283ReentrantLock -- 可重入的锁 可重入锁指 ... -
线程运行栈信息的获取
2011-03-24 17:23 1267线程运行栈信息的获取 ... -
java序列化——Serializable
2011-03-15 23:17 1031类通过实现 java.io.Serializable 接口 ... -
Java aio(异步网络IO)初探
2011-03-11 16:34 1522按照《Unix网络编程》的 ... -
JAVA NIO 简介
2011-03-11 13:38 10771. 基本 概念 IO 是主存和外部设备 ( 硬盘、终 ... -
[字节码系列]ObjectWeb ASM构建Method Monitor
2011-03-08 18:08 828在前面的篇章中,我们看到Java Instru ...
相关推荐
使用java.util.timer实现的简单定时任务,在实现简单一次性定时任务时,使用java.util.timer非常的简单易用,适合没有接触过quartz的新手急用。
java.util.ConcurrentModificationException 异常问题详解1
本文通过对数据压缩算法的简要介绍,然后以详细的示例演示了利用java.util.zip包实现数据的压缩与解压,并扩展到在网络传输方面如何应用java.util.zip包现数据压缩与解压
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
详细介绍了java.util.logging.Logger的用法和结构,对如果扩展Logger起到抛砖引玉的作用!尊重劳动成果,亲下载了要给个评价!
Tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException:java.lang.OutOfMemoryError),内附解决方案!
Exception in thread “main“ java.util.InputMismatchException
Java并发编程工具包java.util.concurrent的UML类结构图 PDF
java.util.Date与java.sql.Date互转及字符串转换为日期时间格式.docx
java.util.concurrent系列文章(1) java.util.concurrent系列文章(1) java.util.concurrent系列文章(1) java.util.concurrent系列文章(1)
详细介绍java.util.Date和java.sql.Date相互转换的多种方法总结,希望对大家有帮助
java并发工具包 java.util.concurrent中文版-带书签版
java.util包
这是我在编写struts2中遇到的问题,整理出来,包括截图,希望可以帮到大家
世界范围内的时区列表。由 java.util.TimeZone 类导出
java.util包源码,pdf版,方便打印
java.util.pdf
java.util包总结,方便大家学习。请多指教。
java.util.concurrent总体概览图。 收取资源分3分。需要的同学可以下载一下。 java.util.concurrent主要包括5个部分executor,colletions,locks,atomic,tools。 该图详细的列举了并发包下面的结构,包含所有接口和...
Java.util包常用接口