java中定時(shí)器的簡(jiǎn)單使用
1.首先肯定是容器一啟動(dòng)就要啟動(dòng)定時(shí)器,所以我們可以選擇把定時(shí)器寫(xiě)在一個(gè)監(jiān)聽(tīng)器里,容器一啟動(dòng)所以監(jiān)聽(tīng)器也就跟著啟動(dòng),然后定時(shí)器就可以工作了。
第一步,把自己寫(xiě)的監(jiān)聽(tīng)器加到web.xml中;
第二步,寫(xiě)一個(gè)監(jiān)聽(tīng)器,實(shí)現(xiàn)ServletContextListener接口;
第三步,寫(xiě)一個(gè)定時(shí)器,繼承TimerTask,在復(fù)寫(xiě)的run()方法里寫(xiě)具體的業(yè)務(wù)邏輯。
第四步,在自己的監(jiān)聽(tīng)器里復(fù)寫(xiě)的
public void contextInitialized(ServletContextEvent arg0){
}
這個(gè)方法里調(diào)用定時(shí)器的schedule方法。
具體代碼如下:
web.xml添加:
1 《!-- 用于補(bǔ)償認(rèn)證信息異常的數(shù)據(jù),用來(lái)啟動(dòng)定時(shí)器,20170505 --》
2 《listener》
3 《listener-class》com.dcits.app.servlet.MyTimerTaskListener《/listener-class》
4 《/listener》
MyTimerTaskListener.java
package com.dcits.app.servlet;
import java.util.Calendar;
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* @author Weiyongle
* @time 2017-5-5 下午2:05:32
*/
public class MyTimerTaskListener implements ServletContextListener {
private Timer timer = null;
@Override
public void contextDestroyed(ServletContextEvent arg0) {
timer.cancel();
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println(“-----開(kāi)始啟動(dòng)定時(shí)器------”);
Calendar twentyOne = Calendar.getInstance();
twentyOne.set(Calendar.HOUR_OF_DAY, 23);
twentyOne.set(Calendar.MINUTE, 0);
twentyOne.set(Calendar.SECOND, 0);
timer = new Timer(true);
//第一次是晚上23點(diǎn)執(zhí)行,間隔24小時(shí)執(zhí)行一次
timer.schedule(new MyTimerTask(), twentyOne.getTime(), 1000*60*60*24);
/*System.out.println(“-----開(kāi)始啟動(dòng)定時(shí)器------”);
Calendar twentyOne = Calendar.getInstance();
twentyOne.set(Calendar.HOUR_OF_DAY, 14);
twentyOne.set(Calendar.MINUTE, 47);
twentyOne.set(Calendar.SECOND, 0);
timer = new Timer(true);
timer.schedule(new MyTimerTask(), twentyOne.getTime(), 1000*10);*/
}
}
MyTimerTask.java
package com.dcits.app.servlet;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.TimerTask;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
/**
* 定時(shí)器,用于補(bǔ)償認(rèn)證的時(shí)候沒(méi)有獲取到正常返回的那些數(shù)據(jù)
* @author Weiyongle
* @time 2017-5-5 下午2:20:12
*/
public class MyTimerTask extends TimerTask{
private static StringBuffer url = new StringBuffer();
@Override
public void run() {
//生產(chǎn)環(huán)境
// url.append(“https://我是具體的ip地址/nmsypt/servlet/webServlet”);//生產(chǎn)環(huán)境
url.append(“http://localhost:8080/adp/servlet/webServlet”);//本地環(huán)境
Map《String,Object》 reqMap = new HashMap《String,Object》();
//這里的map從數(shù)據(jù)庫(kù)里獲取對(duì)應(yīng)的數(shù)據(jù)不寫(xiě)死就行了,先獲取map,在寫(xiě)個(gè)for循環(huán)進(jìn)行循環(huán)就行了
reqMap.put(“QYMC”,“丹同學(xué)的公司”);
reqMap.put(“NSRSBH”,“158028307441234”);
reqMap.put(“SJHM_FR”,“15802830744”);
reqMap.put(“YZM”,“123456”);
reqMap.put(“CWFZR”,“”);//
reqMap.put(“ZJLX_DM_CW”,“”);//
reqMap.put(“ZJHM_CW”,“”);//
reqMap.put(“ZGRS”,“1234”);
reqMap.put(“SQYY”,“”);//
reqMap.put(“JRCPBM”,“00002”);
reqMap.put(“XYDM”,“1”);
reqMap.put(“XZQHDM”,“”);
reqMap.put(“QYBM”,“QY17900000647001”);
try {
CompensateData.CompensateDatas(url.toString(), reqMap);
System.out.println(“-----成功補(bǔ)償了一條認(rèn)證信息------”);
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
java當(dāng)中的定時(shí)器的4種使用方式
對(duì)于開(kāi)發(fā)游戲項(xiàng)目的同胞來(lái)說(shuō),Timer 這個(gè)東西肯定不會(huì)陌生,今天對(duì)以前自己經(jīng)常使用的定時(shí)進(jìn)行了一番小小的總結(jié)!沒(méi)有寫(xiě)具體實(shí)現(xiàn)的原理,只是列舉出了其中的四種比較常見(jiàn)的使用方法,相對(duì)而言,所以只要按照其所列舉的例子仿照即可!
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimeTest {
public static void main(String[] args) {
timer1();
//timer2();
//timer3();
//timer4();
}
// 第一種方法:設(shè)定指定任務(wù)task在指定時(shí)間time執(zhí)行 schedule(TimerTask task, Date time)
public static void timer1() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println(“-------設(shè)定要指定任務(wù)--------”);
}
}, 2000);// 設(shè)定指定的時(shí)間time,此處為2000毫秒
}
// 第二種方法:設(shè)定指定任務(wù)task在指定延遲delay后進(jìn)行固定延遲peroid的執(zhí)行
// schedule(TimerTask task, long delay, long period)
public static void timer2() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println(“-------設(shè)定要指定任務(wù)--------”);
}
}, 1000, 5000);
}
// 第三種方法:設(shè)定指定任務(wù)task在指定延遲delay后進(jìn)行固定頻率peroid的執(zhí)行。
// scheduleAtFixedRate(TimerTask task, long delay, long period)
public static void timer3() {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println(“-------設(shè)定要指定任務(wù)--------”);
}
}, 1000, 2000);
}
// 第四種方法:安排指定的任務(wù)task在指定的時(shí)間firstTime開(kāi)始進(jìn)行重復(fù)的固定速率period執(zhí)行.
// Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
public static void timer4() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 12); // 控制時(shí)
calendar.set(Calendar.MINUTE, 0); // 控制分
calendar.set(Calendar.SECOND, 0); // 控制秒
Date time = calendar.getTime(); // 得出執(zhí)行任務(wù)的時(shí)間,此處為今天的12:00:00
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println(“-------設(shè)定要指定任務(wù)--------”);
}
}, time, 1000 * 60 * 60 * 24);// 這里設(shè)定將延時(shí)每天固定執(zhí)行
}
}
Spring定時(shí)器應(yīng)該怎么用呢?
在Java中呢,我們總是會(huì)有一些定時(shí)任務(wù),比如說(shuō):發(fā)郵件、短信推送消息;發(fā)公告、更新等等。那么Spring中的定時(shí)器應(yīng)該如何使用呢?接下來(lái)我們就來(lái)說(shuō)說(shuō)Spring定時(shí)器的使用方法。
1.我們今天呢,是以springboot項(xiàng)目為基礎(chǔ)進(jìn)行的,大家如果不會(huì)使用Springboot的話(huà)可以先收藏一下,明天我會(huì)出一個(gè)Springboot項(xiàng)目的搭建文章。到時(shí)候你可以返回來(lái)再看這篇。因?yàn)閟pringboot實(shí)在是在方便了,用完之后就不想再回去寫(xiě)配置文件了。。。
2.首先呢,我們需要在啟動(dòng)主程序中開(kāi)啟定時(shí),只需要在主類(lèi)上增加@EnableScheduling即可,相信大家看字面意思也明白是什么意思啦!
3.接下來(lái)就是寫(xiě)我們的定時(shí)類(lèi),那么你就可以在定時(shí)類(lèi)中完成自己的需求,無(wú)論是發(fā)送郵件、短信;還是公告、更新,他統(tǒng)統(tǒng)可以準(zhǔn)確無(wú)誤的幫你執(zhí)行,如果你有興趣,也可以寫(xiě)一個(gè)搶購(gòu)物品呀、車(chē)票呀什么的腳本。當(dāng)然說(shuō)起來(lái),寫(xiě)腳本可能python更強(qiáng)一些。
4.在以上代碼中呢,我使用 @Autowired注入了testService,為的是告訴大家,使用@Component的類(lèi)同Controller、Service一樣,可以使用自動(dòng)注入。
5.定時(shí)方法上方@Scheduled(cron = “0 0/1 * * * ?”)代表每分鐘執(zhí)行一次方法。testService中的方法僅僅是return了一個(gè)“you can you up?。?!”字符串。我就不把代碼貼出來(lái)。
6.大家可能很迷惑@Scheduled里面的時(shí)間到底是怎么算的,說(shuō)實(shí)話(huà)~我也沒(méi)學(xué)會(huì)。但是你可以去搜索一下?。。∥以谶@里貼出幾個(gè)簡(jiǎn)單的例子,大家如果悟性好的,可以嘗試自己悟一下子?。。?/p>
評(píng)論