ในสองบทความแรกเราใช้ข้อความ Synchronous/assynchronous ส่งข้อความ SMS และ จำกัด ความถี่ในการส่งข้อความ SMS ในบทความนี้เราแนะนำจำนวนครั้งที่เราส่งข้อความ SMS ไปยังผู้ใช้รายเดียวกัน (ตัดสินตามหมายเลขโทรศัพท์มือถือและ IP) ทุกวัน
1. โครงสร้างตารางข้อมูล
เนื่องจากเราจำเป็นต้องบันทึกบันทึกการส่งตลอดทั้งวันเราจึงบันทึกข้อมูลลงในฐานข้อมูลที่นี่ โครงสร้างตารางข้อมูลมีดังนี้:
ประเภทคือประเภทของรหัสการตรวจสอบเช่นการลงทะเบียนรีเซ็ตรหัสผ่าน ฯลฯ
ค่าเริ่มต้นของ SendTime คือเวลาปัจจุบัน
2. จำกัด จำนวนเวลาการส่งรายวัน
เราจำเป็นต้องใช้อินเทอร์เฟซและคลาสเอนทิตีที่กล่าวถึงในบทความก่อนหน้านี้ที่นี่
dailycountfilter.java
ชั้นเรียนสาธารณะ DailyCountFilter ใช้ SMSFilter {ส่วนตัว INT IPDailyMaxSendCount; INT ส่วนตัว Mobiledailymaxsendcount; SMSDAO ส่วนตัว SMSDAO; // รหัสที่ไร้ประโยชน์บางอย่างถูกละเว้น @Override ตัวกรองบูลีนสาธารณะ (SMSENTITY SMSENTITY) {ถ้า (smsdao.getMobileCount (smsentity.getMobile ())> = mobiledailymaxsendcount) {return false; } if (smsdao.getipcount (smsentity.getip ())> = ipdailymaxsendcount) {return false; } smsdao.saveentity (smsentity); กลับมาจริง; -รหัสหลักนั้นง่ายมาก ขั้นแรกให้ตรวจสอบว่าจำนวนครั้งที่ส่งไปยังหมายเลขโทรศัพท์มือถือที่ระบุมาถึงจำนวนสูงสุดของเวลาการส่งและจากนั้นพิจารณาว่าจำนวนครั้งที่ส่งโดยคำขอ IP ที่ระบุมาถึงจำนวนสูงสุดหรือไม่ หากไม่มีของพวกเขาให้บันทึกหมายเลขโทรศัพท์มือถือ IP และข้อมูลอื่น ๆ ที่ส่งเวลานี้ไปยังฐานข้อมูล
แน่นอนว่ามีปัญหาบางอย่างเกี่ยวกับคลาสนี้: เธรดอื่น ๆ อาจบันทึกข้อมูลใหม่ระหว่างการตัดสินว่าจำนวนสูงสุดเกินจำนวนสูงสุดและข้อมูลเอนทิตีที่ถูกบันทึกไว้หรือไม่ สิ่งนี้ส่งผลให้การตัดสินสองครั้งข้างต้นไม่ถูกต้องอย่างแน่นอน
เราสามารถใช้ธุรกรรมระดับอนุกรมเพื่อให้แน่ใจว่าจะไม่มีข้อผิดพลาด แต่ค่าใช้จ่ายสูงเกินไป ดังนั้นเราจะไม่ทำการประมวลผลที่นี่ เพราะเราได้ดำเนินการ จำกัด ความถี่การส่งมาก่อน หากเราใช้ FrequencyFilter เพื่อกรองหนึ่งครั้งและ จำกัด ความถี่ในการส่งสัญญาณปัญหาที่กล่าวถึงข้างต้นนั้นเป็นไปไม่ได้
มีปัญหาอีกประการหนึ่ง: เมื่อเวลาผ่านไปตารางนี้จะมีขนาดใหญ่ขึ้นเรื่อย ๆ ส่งผลให้ประสิทธิภาพการค้นหาค่อนข้างแย่ เราสามารถลบข้อมูลที่ไร้ประโยชน์ได้ทุกครั้งในขณะที่เราทำในบทความก่อนหน้า นอกจากนี้เรายังสามารถสร้างตารางแบบไดนามิกแล้วแทรกข้อมูลลงในตารางใหม่
3. ใช้ตารางไดนามิก
ที่นี่เราใช้วิธีแก้ปัญหาที่สอง: ชื่อของตารางข้อมูลคือ "SMS_Four-Digit Year_Two-Digit เดือน" เช่น "SMS_2016_02" เมื่อแทรกข้อมูลให้รับชื่อตารางตามเวลาปัจจุบันจากนั้นแทรก นอกจากนี้ใช้ควอตซ์เพื่อสร้างตารางข้อมูลสำหรับเดือนถัดไปและเดือนถัดไปเวลา 2 นาฬิกาในวันที่ 20 ของแต่ละเดือน:
ก่อนอื่นเราแก้ไขคลาส DailyCountFilter เพิ่มแผนงานในคลาสนี้และสร้างตารางข้อมูลเป็นประจำ:
dailycountfilter.java
// ขึ้นอยู่กับรหัสด้านบนเพิ่มรหัสสาธารณะคลาสสาธารณะ DailyCountFilter ใช้ SMSFilter {Scheduler Scheduler ส่วนตัว @Override โมฆะสาธารณะ init () พ่น Schedulerexception {smsdao.createTable (0); // สร้างตารางข้อมูลของเดือนนี้ smsdao.createtable (1); // สร้างตารางข้อมูลของเดือนถัดไป schedulerFactory sf = ใหม่ stdschedulerfactory (); schede = sf.getscheduler (); // สร้างคอนเทนเนอร์ควอตซ์ JobDatamap JobDatamap = ใหม่ JobDatamap (); JobDatamap.put ("SMSDAO", SMSDAO); // สร้างแผนที่ข้อมูลที่จำเป็นต้องใช้เมื่อทำงาน // สร้างวัตถุงานซึ่งดำเนินการงานจริงงานงาน = Jobbuilder.newJob (createsMstableJob.class) .UsingJobData (JobDatamap) // สร้างวัตถุทริกเกอร์ซึ่งใช้เพื่ออธิบายกฎเวลาสำหรับการเรียกใช้งานของงาน // ตัวอย่างเช่น crontrigger trigger = triggerbuilder.newtrigger () .withidentity ("สร้าง SMS Table Trigger"). withschedule (cronschedulebuilder.cronschedule เดือน build (); sched.schedulejob (งาน, ทริกเกอร์); // ลงทะเบียนงานและทริกเกอร์กฎ sched.start (); // เริ่มการตั้งเวลา} @Override โมฆะสาธารณะทำลาย () {ลอง {sched.shutdown (); } catch (scheduLeRexception e) {}} คลาสคงที่ระดับสาธารณะ createsMstableJob ใช้งาน {@Override โมฆะสาธารณะดำเนินการ (jobExecutionContext Context) พ่น JobExecutionException {JobDatamap dataMap = บริบท smsdao smsdao = (smsdao) datamap.get ("smsdao"); // รับ smsdao object smsdao.createtable (1); // สร้างตารางข้อมูลของเดือนถัดไป smsdao.createtable (2); // สร้างตารางข้อมูลของเดือนถัดไป}}}}ถัดไปลองดูที่รหัสของ SMSDAO:
smsdao.java
คลาสสาธารณะ SMSDAO { / *** สร้างตารางบันทึกใหม่** @param monthexcursion จำนวนเดือนชดเชย* / โมฆะสาธารณะ createTable (int monthExcursion) {String SQL = "สร้างตารางถ้าไม่มี" + getTableName // เรียกใช้คำสั่ง SQL}/ *** บันทึกวัตถุเอนทิตี SMSENTITY*/ โมฆะสาธารณะ saveEntity (smsentity smsentity) {string sql = "แทรกลงใน" + getNowTableName () + "(มือถือ, ip, type) ค่า (? // ดำเนินการคำสั่ง SQL}/ *** รับหมายเลขโทรศัพท์มือถือที่ระบุและขอ SMS วันนี้** @Param ผู้ใช้มือถือมือถือมือถือ* @@Return จำนวนครั้งขอ SMS วันนี้*/ Public Long GetMobileCount (สตริงมือถือ) // ดำเนินการคำสั่ง SQL และส่งคืนผลลัพธ์การสืบค้น} // เมธอด getIPCount ถูกละเว้น/ *** รับชื่อของตารางที่ใช้ตอนนี้*/ สตริงส่วนตัว getNowTableName () {return getTableName (0); } DateFormat Private DateFormat = ใหม่ SimpleDateFormat ("yyyy_mm"); / *** รับชื่อตารางของเดือนออฟเซ็ตเดือน** @param monthexcursion หมายเลขของเดือนออฟเซ็ต* @return ชื่อตารางของเดือนที่สอดคล้องกัน*/ สตริงส่วนตัว getTableName (int monthexcursion) {ปฏิทินปฏิทิน = ปฏิทิน. getInstance (); Calendar.Add (Calendar.Month, MonthExcursion); วันที่ = calendar.getTime (); ส่งคืน "sms_" + dateformat.format (วันที่); -มีข้อกำหนดเบื้องต้นสำหรับการดำเนินการที่ประสบความสำเร็จของวิธีการสร้างสรรค์ใน SMSDAO ซึ่งก็คือมีตารางข้อมูล SMS วิธีการสร้างสรรค์จะคัดลอกโครงสร้างของตาราง SMS เพื่อสร้างตารางข้อมูลใหม่
เราเก็บข้อมูลสำหรับการส่งข้อความ (หมายเลขโทรศัพท์มือถือ IP เวลา ฯลฯ ) แทนที่จะลบโดยตรงเพราะเราอาจต้องวิเคราะห์ข้อมูลเหล่านี้ในอนาคตเพื่อรับข้อมูลที่เราต้องการเช่นการตัดสินอัตราการมาถึงของผู้ให้บริการ SMS
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่าคุณจะให้ความสนใจต่อไป