การเพิ่มงานเวลาในโปรแกรมเว็บ Java นี่คือสองวิธี: 1. ใช้การฉีดผู้ฟัง 2. ใช้คำอธิบายประกอบฤดูใบไม้ผลิ @Scheduled ฉีด
แนะนำรูปแบบที่สอง
1. ใช้การฉีดผู้ฟัง
①: สร้างคลาสผู้ฟัง:
นำเข้า Javax.servlet.servletContextEvent; นำเข้า Javax.servlet.servletContextListener; คลาสสาธารณะ TimerDatatAskListener ใช้ ServletContextListener {@Override void บริบทสาธารณะ } @Override void public ContextDestroyed (ServletContextEvent ServletContextEvent) {}}②: สร้างคลาสงานที่กำหนดเวลา:
นำเข้า java.util.calendar; นำเข้า java.util.date; นำเข้า java.util.timer; TimerManager ชั้นเรียนสาธารณะ {// ช่วงเวลา: 24H ส่วนตัวคงที่สุดท้าย Long ระยะยาว _Day = 24 * 60 * 60 * 1,000; Public TimerManager () {ปฏิทินปฏิทิน = Calendar.getInstance (); // ปรับแต่งการดำเนินการของปฏิทิน Set (Calendar.hour_of_day, 12); Calendar.set (Calendar.minute, 30); Calendar.set (Calendar.second, 30); วันที่ = calendar.getTime (); // เวลาของครั้งแรกในการดำเนินการงานเวลา // ถ้าจุดเวลาของเวลาผ่านไปการดำเนินการจะเริ่มในวันที่สองถ้า (วันที่ก่อน (วันที่ใหม่ ())) {วันที่ = this.addday (วันที่, 1); } ตัวจับเวลาตัวจับเวลา = ตัวจับเวลาใหม่ (); timertaskservice task = new timertaskservice (); // กำหนดเวลางานที่ระบุเพื่อเริ่มดำเนินการล่าช้าคงที่ซ้ำ ๆ ณ เวลาที่กำหนด timer.schedule (งาน, วันที่, period_day); } // เพิ่มหรือลดจำนวนวันวันที่ส่วนตัว addday (วันที่วันที่, int num) {ปฏิทิน startdt = calendar.getInstance (); startdt.settime (วันที่); startdt.add (calendar.day_of_month, num); return startdt.getTime (); -③: สร้างคลาส Timertask:
นำเข้า java.util.timertask; Timertaskservice ระดับสาธารณะขยาย Timertask {@Override โมฆะสาธารณะ Run () {ลอง {// ตรรกะงานที่จะดำเนินการถูกเขียนที่นี่ System.out.println ("แทรกรหัสผ่านสำเร็จ!"); } catch (exception e) {system.out.println ("แทรกรหัสผ่านล้มเหลว!"); -④: ลงทะเบียนผู้ฟังใน web.xml
<!-TimerDatatAskListener Listener-> <Sistener> <Sistener-Lass> com.jsiqi.resume.service.timerDatatAskListener </sisterer-lass> </sisterer>
2. ฉีดโดยใช้คำอธิบายประกอบฤดูใบไม้ผลิ
กรอบสำหรับโครงการของฉันคือ Spring + SpringMVC + MyBatis
ตัวอย่างรหัส:
นำเข้า org.springframework.scheduling.annotation.scheduled; นำเข้า org.springframework.stereotype.component; @componentpublic คลาส timertask {@scheduled (cron = " */30 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * System.out.println ("แทรกรหัสผ่านสำเร็จ!"); } catch (exception e) {system.out.println ("แทรกรหัสผ่านล้มเหลว!"); -การตั้งค่าเวลาเวลามีดังนี้:
Crontrigger Configuration รูปแบบเต็มคือ: [วินาที] [นาที] [ชั่วโมง] [วัน] [เดือน] [สัปดาห์] [ปี] ตัวอย่าง: 0 0 10,14,16 * *? 10.00 น. ทุกวันเวลา 14.00 น. 4: 0 0/30 9-17 * *? 0 ครึ่งชั่วโมงในช่วงเก้าถึงห้าชั่วโมงทำงาน 0 0 12? * พุธระบุว่าทุกวันพุธเวลา 12.00 น. "0 0 12 * *?" 0 15 10 * *? "10:15 น. ทุกวันทริกเกอร์" 0 15 10 * *? 2005 "2005 ทริกเกอร์รายวัน" 0 * 14 * *? "ทริกเกอร์" 0/5 14 * *? "ทริกเกอร์" 0/5 14 * *? "ทริกเกอร์" 0/5 14,18 * *? "ทริกเกอร์" 0/5 14,18 * *? 3 พุธ "ทริกเกอร์" 0 10 และ 14:44 น. ในวันพุธของเดือนมีนาคมทุกปี 10:15 น. ในวันจันทร์ถึงวันศุกร์ทริกเกอร์ "0 15 10 15 *?" 10:15 น. ในวันที่ 15 ของเดือน "0 15 10 L *?" 10:15 น. ในวันสุดท้ายของเดือน "0 15 10? * 6l" 10:15 น. ในวันศุกร์สุดท้ายของเดือน "0 15 10? * 6l" 10:15 น. ในวันศุกร์สุดท้ายของเดือน "0 15 10? * 6L 2002-2005" 10:15 น. ในวันศุกร์สุดท้ายของเดือน
| หมายเลขซีเรียล | อธิบาย | จำเป็นหรือไม่ | ค่าที่อนุญาต | ได้รับอนุญาตให้ไวด์การ์ด |
|---|---|---|---|---|
| 1 | ที่สอง | ใช่ | 0-59 | - |
| 2 | จุด | ใช่ | 0-59 | - |
| 3 | ชั่วโมง | ใช่ | 0-23 | - |
| 4 | วัน | ใช่ | 1-31 | - / LW |
| 5 | ดวงจันทร์ | ใช่ | 1-12 หรือ Jan-Dec | - |
| 6 | สัปดาห์ | ใช่ | 1-7 หรือ Sun-Sat | - / LW |
| 7 | ปี | เลขที่ | ว่างเปล่าหรือ 1970-2099 | - |
คำอธิบายไวด์การ์ด:
* หมายถึงค่าทั้งหมด ตัวอย่างเช่น: ตั้งค่า "*" บนฟิลด์บางส่วนซึ่งหมายความว่าทุกนาทีจะถูกเรียกใช้
- หมายความว่าไม่มีการระบุค่า สถานการณ์ที่ใช้คือคุณไม่จำเป็นต้องใส่ใจเกี่ยวกับคุณค่าของฟิลด์นี้ที่ตั้งไว้ในปัจจุบัน
ตัวอย่างเช่น: การดำเนินการจะถูกเรียกใช้ในวันที่ 10 ของแต่ละเดือน แต่ไม่สนใจวันประจำสัปดาห์ดังนั้นฟิลด์ที่ต้องตั้งค่าเป็น "?" ตั้งค่าเป็น 0 0 0 0 10 *?
- ระบุช่วงเวลา ตัวอย่างเช่นการตั้งค่า "10-12" ในชั่วโมงหมายความว่าจะถูกเรียกใช้ 10, 11 และ 12 คะแนน
หมายถึงการระบุหลายค่าตัวอย่างเช่นการตั้งค่า "จันทร์, พุธ, ศุกร์" ในสนามรายสัปดาห์หมายถึงการกระตุ้นในวันจันทร์วันพุธและวันศุกร์
/ สำหรับการทริกเกอร์ที่เพิ่มขึ้น หากการตั้งค่า "5/15" ในวินาทีนั้นหมายความว่าเริ่มต้นจาก 5 วินาทีกระตุ้นทุก ๆ 15 วินาที (5,20,35,50) ตั้งค่า '1/3' ในฟิลด์เดือนเพื่อเริ่มต้นวันที่ 1 ของเดือนและทริกเกอร์ทุกสามวัน
l หมายถึงความหมายสุดท้าย ในการตั้งค่าฟิลด์วันมันบ่งบอกถึงวันสุดท้ายของเดือน (ตามเดือนปัจจุบันถ้าเป็นเดือนกุมภาพันธ์มันจะขึ้นอยู่กับว่ามันเป็น Runnian [Leap]) หรือไม่ ในฟิลด์สัปดาห์จะระบุวันเสาร์ซึ่งเทียบเท่ากับ "7" หรือ "SAT" หากตัวเลขถูกนำหน้าด้วย "L" มันหมายถึงข้อมูลสุดท้ายของข้อมูล ตัวอย่างเช่นการตั้งค่ารูปแบบเช่น "6L" ในฟิลด์รายสัปดาห์หมายถึง "วันศุกร์สุดท้ายของเดือน"
W ระบุวันทำงานที่ใกล้เคียงที่สุดจนถึงวันที่กำหนด (วันจันทร์ถึงวันศุกร์) ตัวอย่างเช่นตั้งค่า "15W" ในฟิลด์วันเพื่อระบุวันทำงานที่ใกล้เคียงที่สุดถึงวันที่ 15 ของแต่ละเดือน หากวันที่ 15 เกิดขึ้นเป็นวันเสาร์ให้มองหาทริกเกอร์วันศุกร์ (14) ล่าสุด หาก 15 ไม่ได้เป็นรายสัปดาห์ให้มองหาทริกเกอร์วันจันทร์ (16) ล่าสุด หากวันที่ 15 เกิดขึ้นในวันธรรมดา (วันจันทร์ถึงวันศุกร์) มันจะก่อให้เกิดในวันนั้น หากรูปแบบถูกระบุเป็น "1W" จะระบุวันทำงานล่าสุดหลังจากวันที่ 1 ของแต่ละเดือน หากวันที่ 1 คือวันเสาร์มันจะทริกเกอร์ในวันที่ 3 วันจันทร์หน้า (หมายเหตุสามารถตั้งค่าเฉพาะเฉพาะก่อน "W" และช่วงเวลา "-" ไม่อนุญาตให้ใช้)
# หมายเลขซีเรียล (แสดงถึงสัปดาห์ของแต่ละเดือน) ตัวอย่างเช่นการตั้งค่า "6# 3" ในฟิลด์สัปดาห์ระบุวันเสาร์ที่สามของแต่ละเดือน โปรดทราบว่าหากมีการระบุ "#5" มันจะเกิดขึ้นว่าไม่มีวันเสาร์ในสัปดาห์ที่ห้าการกำหนดค่าจะไม่ถูกกระตุ้น (เหมาะที่สุดสำหรับวันแม่และวันพ่อ);
เคล็ดลับ:
'L' และ 'W' สามารถใช้ร่วมกันได้ หาก "LW" ถูกตั้งค่าในฟิลด์วันนั้นหมายความว่าจะถูกกระตุ้นในวันทำการสุดท้ายของเดือน
การตั้งค่าของฟิลด์สัปดาห์เป็นกรณีที่ไม่ได้รับการตอบรับหากมีการใช้ตัวอักษรภาษาอังกฤษนั่นคือ Mon นั้นเหมือนกับ Mon;
อ้างถึง:
https://www.cnblogs.com/liaojie970/p/5913272.html
http://prisonbreak.iteye.com/blog/2247216