java中定時器的簡單使用
1.首先肯定是容器一啟動就要啟動定時器,所以我們可以選擇把定時器寫在一個監(jiān)聽器里,容器一啟動所以監(jiān)聽器也就跟著啟動,然后定時器就可以工作了。
第一步,把自己寫的監(jiān)聽器加到web.xml中;
第二步,寫一個監(jiān)聽器,實現(xiàn)ServletContextListener接口;
第三步,寫一個定時器,繼承TimerTask,在復(fù)寫的run()方法里寫具體的業(yè)務(wù)邏輯。
第四步,在自己的監(jiān)聽器里復(fù)寫的
public void contextInitialized(ServletContextEvent arg0){
}
這個方法里調(diào)用定時器的schedule方法。
具體代碼如下:
web.xml添加:
1 《!-- 用于補償認(rèn)證信息異常的數(shù)據(jù),用來啟動定時器,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(“-----開始啟動定時器------”);
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點執(zhí)行,間隔24小時執(zhí)行一次
timer.schedule(new MyTimerTask(), twentyOne.getTime(), 1000*60*60*24);
/*System.out.println(“-----開始啟動定時器------”);
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;
/**
* 定時器,用于補償認(rèn)證的時候沒有獲取到正常返回的那些數(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ù)庫里獲取對應(yīng)的數(shù)據(jù)不寫死就行了,先獲取map,在寫個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(“-----成功補償了一條認(rèn)證信息------”);
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
java當(dāng)中的定時器的4種使用方式
對于開發(fā)游戲項目的同胞來說,Timer 這個東西肯定不會陌生,今天對以前自己經(jīng)常使用的定時進(jìn)行了一番小小的總結(jié)!沒有寫具體實現(xiàn)的原理,只是列舉出了其中的四種比較常見的使用方法,相對而言,所以只要按照其所列舉的例子仿照即可!
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在指定時間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è)定指定的時間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在指定的時間firstTime開始進(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); // 控制時
calendar.set(Calendar.MINUTE, 0); // 控制分
calendar.set(Calendar.SECOND, 0); // 控制秒
Date time = calendar.getTime(); // 得出執(zhí)行任務(wù)的時間,此處為今天的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è)定將延時每天固定執(zhí)行
}
}
Spring定時器應(yīng)該怎么用呢?
在Java中呢,我們總是會有一些定時任務(wù),比如說:發(fā)郵件、短信推送消息;發(fā)公告、更新等等。那么Spring中的定時器應(yīng)該如何使用呢?接下來我們就來說說Spring定時器的使用方法。
1.我們今天呢,是以springboot項目為基礎(chǔ)進(jìn)行的,大家如果不會使用Springboot的話可以先收藏一下,明天我會出一個Springboot項目的搭建文章。到時候你可以返回來再看這篇。因為springboot實在是在方便了,用完之后就不想再回去寫配置文件了。。。
2.首先呢,我們需要在啟動主程序中開啟定時,只需要在主類上增加@EnableScheduling即可,相信大家看字面意思也明白是什么意思啦!
3.接下來就是寫我們的定時類,那么你就可以在定時類中完成自己的需求,無論是發(fā)送郵件、短信;還是公告、更新,他統(tǒng)統(tǒng)可以準(zhǔn)確無誤的幫你執(zhí)行,如果你有興趣,也可以寫一個搶購物品呀、車票呀什么的腳本。當(dāng)然說起來,寫腳本可能python更強一些。
4.在以上代碼中呢,我使用 @Autowired注入了testService,為的是告訴大家,使用@Component的類同Controller、Service一樣,可以使用自動注入。
5.定時方法上方@Scheduled(cron = “0 0/1 * * * ?”)代表每分鐘執(zhí)行一次方法。testService中的方法僅僅是return了一個“you can you up!!!”字符串。我就不把代碼貼出來。
6.大家可能很迷惑@Scheduled里面的時間到底是怎么算的,說實話~我也沒學(xué)會。但是你可以去搜索一下!!!我在這里貼出幾個簡單的例子,大家如果悟性好的,可以嘗試自己悟一下子!!!
評論