一.java.util.timer類(一般不用它)
首先在web.xml中配置listener監聽器
<?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> <!-- 可以用來啟動schelduledExcutorsService 或 timer --> <listener> <listener-class>com.timer.TimerListener</listener-class> </listener> </web-app>?
然后在com.timer包下創建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("執行TimerListener構造函數"); } 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); //服務器啟動時就執行一次 new SchelduCall().scheldul(); //可以調用scheldul()方法 } }
?任務類:topicTask.java
package com.timer; import java.util.*; public class TopicTask extends TimerTask{ public void run() { System.out.println("task:"+new Date()); } }
?然后啟動服務器就能循環執行任務了。
?
?
?
二.使用類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); //過五秒后開始執行,然后循環7秒執行一次 scheduler.schedule(new Runnable() { //第27秒后執行 public void run() { beeperHandle.cancel(true); System.out.println("stop"); } }, 27, TimeUnit.SECONDS); //scheduler.shutdown(); } }?
然后再TimerListener中調用即可
?
?
?
三.自然要屬任務調度框架quartz
1.首先在web.xml文件中加入 如下內容(根據自己情況設定)
在web.xml中添加QuartzInitializerServlet,Quartz為能夠在web應用中使用,提供了一個QuartzInitializerServlet和一個QuartzInitializerListener,用于在加載web應用時,對quartz進行初始化。
?
<?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> <!-- 使用監聽器初始化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文件的配置(各項屬性說明下次寫),內容如下:
上面提到了quartz.properties,這是自行指定的,Quartz提供了一個默認的配置文件,可以滿足基本的j2se應用,如果在 web應用中,我們想把job,trigger配置都寫到文件中,就需要自己來寫,并指定在初始化時加載我們自己的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文件配置(各項屬性說明下次寫),內容如下:
quartz要使用插件來加載自己的xml配置文件,上面指定加載classes\quartz_job.xml文件。
我寫了3個類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>?
?
給一個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()); } }
?其他可以寫自己的業務邏輯
?
還可以使用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; /* * 使用類調用。直接運行 * */ public class FirstDemo { public void run() throws SchedulerException{ // 創建調度者工廠 SchedulerFactory schedulerFactory = new StdSchedulerFactory(); // 用工廠創建一個調度者 Scheduler scheduler = schedulerFactory.getScheduler(); // 利用 Quartz 提供的 getNextGivenSecondDate 返回一個當前時間四舍五入的 5 的倍數時間 long ts = TriggerUtils.getNextGivenSecondDate(null, 5).getTime(); // 創建一個工作,并命名為‘job1’,放入‘group1’組中,HellowWorl 是在此工作中需要執行的類 JobDetail jobDetail = new JobDetail("job1","mygroup",HelloWorld.class); // 創建一個觸發器,并命名為‘trigger1’,將此觸發器設置在 ‘job1’ 上 ,并設置什么情況下啟動 SimpleTrigger simpleTrigger = new SimpleTrigger("trigger1","job1", new Date(ts), null, -1, 1000L); // 將 ‘job1’ 加入調度者中, scheduler.scheduleJob(jobDetail, simpleTrigger); // 開始運行調度程序 scheduler.start(); // 停止調度程序 // scheduler.shutdown(true); } public static void main(String[] args) throws SchedulerException { FirstDemo example = new FirstDemo(); example.run(); } }?
以上有些是拿著前輩的demo,我整合一下。前輩看到勿怪
。
?
最后給一個包含3種方式的demo.
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
