一.java.util.timer類(一般不用它)
首先在web.xml中配置listener監(jiān)聽器
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 可以用來啟動(dòng)schelduledExcutorsService 或 timer -->
<listener>
<listener-class>com.timer.TimerListener</listener-class>
</listener>
</web-app>
?
然后在com.timer包下創(chuàng)建TimerListener.java
package com.timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.scheldule.SchelduCall;
import java.util.*;
public class TimerListener implements ServletContextListener {
private Timer timer;
public TimerListener(){
System.out.println("執(zhí)行TimerListener構(gòu)造函數(shù)");
}
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("destory listener");
timer.cancel();
}
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("init listener");
timer = new Timer(); //可以使用timer
timer.schedule(new TopicTask(), 0, 20*1000); //服務(wù)器啟動(dòng)時(shí)就執(zhí)行一次
new SchelduCall().scheldul(); //可以調(diào)用scheldul()方法
}
}
?任務(wù)類:topicTask.java
package com.timer;
import java.util.*;
public class TopicTask extends TimerTask{
public void run() {
System.out.println("task:"+new Date());
}
}
?然后啟動(dòng)服務(wù)器就能循環(huán)執(zhí)行任務(wù)了。
?
?
?
二.使用類java.util.concurrent.ScheduledExecutorService;
首先建立SchedulCall.java
package com.scheldule;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
public class SchelduCall {
private final ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(1);
public static void main(String[] args) throws Exception{
new SchelduCall().scheldul();
}
public void scheldul(){
final Runnable beeper = new Runnable() {
public void run() { System.out.println("beep"); }
};
final ScheduledFuture<?> beeperHandle =
scheduler.scheduleAtFixedRate(beeper, 5, 7, TimeUnit.SECONDS); //過五秒后開始執(zhí)行,然后循環(huán)7秒執(zhí)行一次
scheduler.schedule(new Runnable() { //第27秒后執(zhí)行
public void run() {
beeperHandle.cancel(true);
System.out.println("stop");
}
}, 27, TimeUnit.SECONDS);
//scheduler.shutdown();
}
}
?
然后再TimerListener中調(diào)用即可
?
?
?
三.自然要屬任務(wù)調(diào)度框架quartz
1.首先在web.xml文件中加入 如下內(nèi)容(根據(jù)自己情況設(shè)定)
在web.xml中添加QuartzInitializerServlet,Quartz為能夠在web應(yīng)用中使用,提供了一個(gè)QuartzInitializerServlet和一個(gè)QuartzInitializerListener,用于在加載web應(yīng)用時(shí),對(duì)quartz進(jìn)行初始化。
?
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 使用監(jiān)聽器初始化quartz -->
<!-- <context-param>
<param-name>config-file</param-name>
<param-value>/quartz.properties</param-value>
</context-param>
<context-param>
<param-name>shutdown-on-unload</param-name>
<param-value>true</param-value>
</context-param>
<listener>
<listener-class>
org.quartz.ee.servlet.QuartzInitializerListener
</listener-class>
</listener>
-->
<!-- 在servlet中初始化 -->
<servlet>
<servlet-name>
QuartzInitializer
</servlet-name>
<servlet-class>
org.quartz.ee.servlet.QuartzInitializerServlet
</servlet-class>
<init-param>
<param-name>config-file</param-name>
<param-value>/quartz.properties</param-value>
</init-param>
<init-param>
<param-name>shutdown-on-unload</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
?
2、quartz.properties文件的配置(各項(xiàng)屬性說明下次寫),內(nèi)容如下:
上面提到了quartz.properties,這是自行指定的,Quartz提供了一個(gè)默認(rèn)的配置文件,可以滿足基本的j2se應(yīng)用,如果在 web應(yīng)用中,我們想把job,trigger配置都寫到文件中,就需要自己來寫,并指定在初始化時(shí)加載我們自己的quratz.properties, 位置放在classes下。
org.quartz.scheduler.instanceName = TestScheduler
org.quartz.scheduler.instanceId = one
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 2
org.quartz.threadPool.threadPriority = 4
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.fileName = quartz_job.xml
org.quartz.plugin.jobInitializer.overWriteExistingJobs = false
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownhook.cleanShutdown = true
?
3、 quartz_job.xml文件配置(各項(xiàng)屬性說明下次寫),內(nèi)容如下:
quartz要使用插件來加載自己的xml配置文件,上面指定加載classes\quartz_job.xml文件。
我寫了3個(gè)類Job
<?xml version="1.0" encoding="UTF-8"?>
<quartz>
<job>
<job-detail>
<name>listener3</name>
<group>group1</group>
<job-class>SimpleQuartzJob</job-class>
</job-detail>
<trigger>
<cron>
<name>hello3</name>
<group>group1</group>
<job-name>listener3</job-name>
<job-group>group1</job-group>
<cron-expression>0/1 * * * * ?</cron-expression>
</cron>
</trigger>
</job>
<job>
<job-detail>
<name>listener1</name>
<group>group1</group>
<job-class>com.web.config.Job1</job-class>
</job-detail>
<trigger>
<cron>
<name>hello</name>
<group>group1</group>
<job-name>listener1</job-name>
<job-group>group1</job-group>
<cron-expression>0/10 * * * * ?</cron-expression>
</cron>
</trigger>
</job>
<job>
<job-detail>
<name>listener2</name>
<group>group2</group>
<job-class>com.web.config.Job2</job-class>
</job-detail>
<trigger>
<cron>
<name>hello2</name>
<group>group2</group>
<job-name>listener2</job-name>
<job-group>group2</job-group>
<cron-expression>0/5 * * * * ?</cron-expression>
</cron>
</trigger>
</job>
</quartz>
?
?
給一個(gè)com.web.config下的Job1.java
package com.web.config;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class Job1 implements Job {
public Job1() {
}
public void execute(JobExecutionContext context)
throws JobExecutionException {
System.out.println("job1-" + new Date());
}
}
?其他可以寫自己的業(yè)務(wù)邏輯
?
還可以使用quartz包中的方法配置jobdetail,trigger
package com.quartz;
import java.util.Date;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;
/*
* 使用類調(diào)用。直接運(yùn)行
* */
public class FirstDemo {
public void run() throws SchedulerException{
// 創(chuàng)建調(diào)度者工廠
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
// 用工廠創(chuàng)建一個(gè)調(diào)度者
Scheduler scheduler = schedulerFactory.getScheduler();
// 利用 Quartz 提供的 getNextGivenSecondDate 返回一個(gè)當(dāng)前時(shí)間四舍五入的 5 的倍數(shù)時(shí)間
long ts = TriggerUtils.getNextGivenSecondDate(null, 5).getTime();
// 創(chuàng)建一個(gè)工作,并命名為‘job1’,放入‘group1’組中,HellowWorl 是在此工作中需要執(zhí)行的類
JobDetail jobDetail = new JobDetail("job1","mygroup",HelloWorld.class);
// 創(chuàng)建一個(gè)觸發(fā)器,并命名為‘trigger1’,將此觸發(fā)器設(shè)置在 ‘job1’ 上 ,并設(shè)置什么情況下啟動(dòng)
SimpleTrigger simpleTrigger = new SimpleTrigger("trigger1","job1", new Date(ts), null, -1, 1000L);
// 將 ‘job1’ 加入調(diào)度者中,
scheduler.scheduleJob(jobDetail, simpleTrigger);
// 開始運(yùn)行調(diào)度程序
scheduler.start();
// 停止調(diào)度程序
// scheduler.shutdown(true);
}
public static void main(String[] args) throws SchedulerException {
FirstDemo example = new FirstDemo();
example.run();
}
}
?
以上有些是拿著前輩的demo,我整合一下。前輩看到勿怪
。
?
最后給一個(gè)包含3種方式的demo.
?
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

