任务调度Word下载.docx
- 文档编号:4462379
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:19
- 大小:306.64KB
任务调度Word下载.docx
《任务调度Word下载.docx》由会员分享,可在线阅读,更多相关《任务调度Word下载.docx(19页珍藏版)》请在冰点文库上搜索。
简单易用
缺点:
所有任务都是由同一个线程来调度,因此所有任务都是串行执行的,同一时间只能有一个任务在执行,前一个任务的延迟或异常都将会影响到之后的任务。
Java代码测试timer:
Timer测试用例一:
packagecom.zx.scheduler;
importjava.util.Timer;
importjava.util.TimerTask;
publicclassTimerTestextendsTimerTask{
privateStringjobName="
"
;
publicTimerTest(StringjobName){
super();
this.jobName=jobName;
}
@Override
publicvoidrun(){
System.out.println("
execute"
+jobName);
publicstaticvoidmain(String[]args){
Timertimer=newTimer();
longdelay1=1*1000;
longperiod1=1000;
//从现在开始1秒钟之后,每隔1秒钟执行一次job1
timer.schedule(newTimerTest("
job1"
),delay1,period1);
longdelay2=2*1000;
longperiod2=2000;
//从现在开始2秒钟之后,每隔2秒钟执行一次job2
job2"
),delay2,period2);
/**
输出结果:
executejob1
executejob2
executejob1
……
*/
Timer测试用例二:
importjava.util.Date;
publicclassPlainTimerTaskextendsTimerTask{
publicvoidrun(){
System.out.println("
输出时间:
+newDate());
}
publicstaticvoidmain(String[]args){
Timertimer=newTimer();
timer.schedule(newPlainTimerTask(),5000L);
}
/**
*输出时间:
MonFeb2911:
16:
49CST2016
*/
Timer测试用例三:
packagecom.zx.test;
publicclassTimerTestextendsTimerTask{
staticintflax=0;
test"
+flax);
flax++;
Timert=newTimer();
longdelay=1000;
longperiod=10*1000;
t.schedule(newTimerTest(),delay,period);
//从现在开始1秒钟之后,每隔10秒钟执行一次
/**结果
test0
test1
test2
test3
ScheduledExecutor
ScheduledExecutor:
其设计思想是,每一个被调度的任务都会由线程池中一个线程去执行,因此任务是并发执行的,相互之间不会受到干扰。
需要注意的是,只有当任务的执行时间到来时,ScheduedExecutor才会真正启动一个线程,其余时间ScheduledExecutor都是在轮询任务的状态。
Java代码测试ScheduledExecutor
importjava.util.concurrent.Executors;
importjava.util.concurrent.ScheduledExecutorService;
importjava.util.concurrent.TimeUnit;
publicclassScheduledExecutorTestimplementsRunnable{
publicScheduledExecutorTest(StringjobName){
publicstaticvoidmain(String[]args){
ScheduledExecutorServiceservice=Executors.newScheduledThreadPool(10);
longinitialDelay1=1;
longperiod1=1;
//从现在开始1秒钟之后,每隔1秒钟执行一次job1
service.scheduleAtFixedRate(
newScheduledExecutorTest("
),initialDelay1,
period1,TimeUnit.SECONDS);
longinitialDelay2=1;
longdelay2=1;
//从现在开始2秒钟之后,每隔2秒钟执行一次job2
service.scheduleWithFixedDelay(
),initialDelay2,
delay2,TimeUnit.SECONDS);
结果:
executejob2
executejob1
Calendar
实现复杂任务调度
Java代码测试Calendar
importjava.util.Calendar;
publicclassScheduledExceutorTest2extendsTimerTask{
publicScheduledExceutorTest2(StringjobName){
Date="
+newDate()+"
execute"
*计算从当前时间currentDate开始,满足条件dayOfWeek,hourOfDay,
*minuteOfHour,secondOfMinite的最近时间
*@return
publicCalendargetEarliestDate(CalendarcurrentDate,intdayOfWeek,
inthourOfDay,intminuteOfHour,intsecondOfMinite){
//计算当前时间的WEEK_OF_YEAR,DAY_OF_WEEK,HOUR_OF_DAY,MINUTE,SECOND等各个字段值
intcurrentWeekOfYear=currentDate.get(Calendar.WEEK_OF_YEAR);
intcurrentDayOfWeek=currentDate.get(Calendar.DAY_OF_WEEK);
intcurrentHour=currentDate.get(Calendar.HOUR_OF_DAY);
intcurrentMinute=currentDate.get(Calendar.MINUTE);
intcurrentSecond=currentDate.get(Calendar.SECOND);
//如果输入条件中的dayOfWeek小于当前日期的dayOfWeek,则WEEK_OF_YEAR需要推迟一周
booleanweekLater=false;
if(dayOfWeek<
currentDayOfWeek){
weekLater=true;
}elseif(dayOfWeek==currentDayOfWeek){
//当输入条件与当前日期的dayOfWeek相等时,如果输入条件中的
//hourOfDay小于当前日期的
//currentHour,则WEEK_OF_YEAR需要推迟一周
if(hourOfDay<
currentHour){
}elseif(hourOfDay==currentHour){
//当输入条件与当前日期的dayOfWeek,hourOfDay相等时,
//如果输入条件中的minuteOfHour小于当前日期的
//currentMinute,则WEEK_OF_YEAR需要推迟一周
if(minuteOfHour<
currentMinute){
}elseif(minuteOfHour==currentSecond){
//当输入条件与当前日期的dayOfWeek,hourOfDay,
//minuteOfHour相等时,如果输入条件中的
//secondOfMinite小于当前日期的currentSecond,
//则WEEK_OF_YEAR需要推迟一周
if(secondOfMinite<
currentSecond){
if(weekLater){
//设置当前日期中的WEEK_OF_YEAR为当前周推迟一周
currentDate.set(Calendar.WEEK_OF_YEAR,currentWeekOfYear+1);
//设置当前日期中的DAY_OF_WEEK,HOUR_OF_DAY,MINUTE,SECOND为输入条件中的值。
currentDate.set(Calendar.DAY_OF_WEEK,dayOfWeek);
currentDate.set(Calendar.HOUR_OF_DAY,hourOfDay);
currentDate.set(Calendar.MINUTE,minuteOfHour);
currentDate.set(Calendar.SECOND,secondOfMinite);
returncurrentDate;
publicstaticvoidmain(String[]args)throwsException{
ScheduledExceutorTest2test=newScheduledExceutorTest2("
);
//获取当前时间
CalendarcurrentDate=Calendar.getInstance();
longcurrentDateLong=currentDate.getTime().getTime();
CurrentDate="
+currentDate.getTime().toString());
//计算满足条件的最近一次执行时间
CalendarearliestDate=test
.getEarliestDate(currentDate,3,16,38,10);
longearliestDateLong=earliestDate.getTime().getTime();
EarliestDate="
+earliestDate.getTime().toString());
//计算从当前时间到最近一次执行时间的时间间隔
longdelay=earliestDateLong-currentDateLong;
//计算执行周期为一星期
longperiod=7*24*60*60*1000;
//从现在开始delay毫秒之后,每隔一星期执行一次job1
service.scheduleAtFixedRate(test,delay,period,
TimeUnit.MILLISECONDS);
CurrentDate=WedFeb0217:
32:
01CST2011
EarliestDate=TueFeb816:
38:
10CST2011
Date=TueFeb816:
10CST2011,executejob1
Date=TueFeb1516:
Quartz
Java代码测试quartz
importorg.quartz.Job;
importorg.quartz.JobDetail;
importorg.quartz.JobExecutionContext;
importorg.quartz.JobExecutionException;
importorg.quartz.Scheduler;
importorg.quartz.SchedulerFactory;
importorg.quartz.Trigger;
importorg.quartz.helpers.TriggerUtils;
publicclassQuartzTestimplementsJob{
//该方法实现需要执行的任务
publicvoidexecute(JobExecutionContextarg0)throwsJobExecutionException{
Generatingreport-"
+arg0.getJobDetail().getFullName()+"
type="
+arg0.getJobDetail().getJobDataMap().get("
type"
));
System.out.println(newDate().toString());
try{
//创建一个Scheduler
SchedulerFactoryschedFact=
neworg.quartz.impl.StdSchedulerFactory();
Schedulersched=schedFact.getScheduler();
sched.start();
//创建一个JobDetail,指明name,groupname,以及具体的Job类名,
//该Job负责定义需要执行任务
JobDetailjobDetail=newJobDetail("
myJob"
"
myJobGroup"
QuartzTest.class);
jobDetail.getJobDataMap().put("
FULL"
//创建一个每周触发的Trigger,指明星期几几点几分执行
Triggertrigger=TriggerUtils.makeWeeklyTrigger(2,17,47);
//注意:
2,17,47表示的是周一17:
47执行任务
trigger.setGroup("
myTriggerGroup"
//从当前时间的下一秒开始执行
trigger.setStartTime(TriggerUtils.getEvenSecondDate(newDate()));
//指明trigger的name
trigger.setName("
myTrigger"
//用scheduler将JobDetail与Trigger关联在一起,开始调度任务
sched.scheduleJob(jobDetail,trigger);
}catch(Exceptione){
e.printStackTrace();
结果:
问题及方案:
使用Quartz时需要添加jar包,报此错误,缺少quartz-版本号.jar
例如:
quartz-1.5.2.jar
运行后:
报此错误:
缺少commons-logging.jar
Quartz整合spring
创建web工程:
itcast-quartz
Main类
packagecom.itcast.quartz;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
publicclassMain{
newClassPathXmlApplicationContext("
classpath:
applicationContext-scheduler.xml"
MyJob类
importorg.springframework.context.ApplicationContext;
importorg.springframework.scheduling.quartz.QuartzJobBean;
publicclassMyJobextendsQuartzJobBean{
protectedvoidexecuteInternal(JobExecutionContextcontext)
throwsJobExecutionException{
myJob执行了。
。
+context.getTrigger().getKey().getName());
try{
ApplicationContextapplicationContext=(ApplicationContext)context.getJobDetail().getJobDataMap().get("
applicationContext"
System.out.println("
获取到的spring容器是"
+applicationContext);
}catch(Exceptione){
System.out.println(e.getMessage());
e.printStackTrace();
出错了"
}
applicationContext-scheduler.xml
<
?
xmlversion="
1.0"
encoding="
UTF-8"
>
beansxmlns="
http:
//www.springframework.org/schema/beans"
xmlns:
context="
//www.springframework.org/schema/context"
xmlns:
xsi="
//www.w3.org/2001/XMLSchema-instance"
x
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 任务 调度