Dalam dua artikel pertama, kami menerapkan pesan SMS yang sinkron/asinkron dan membatasi frekuensi mengirim pesan SMS. Dalam artikel ini, kami memperkenalkan pembatasan berapa kali kami mengirim pesan SMS ke pengguna yang sama (menilai berdasarkan nomor ponsel dan IP) setiap hari.
1. Struktur tabel data
Karena kami perlu merekam catatan pengiriman sepanjang hari, kami menyimpan data ke database di sini. Struktur tabel data adalah sebagai berikut:
Jenis adalah jenis kode verifikasi, seperti pendaftaran, reset kata sandi, dll.
Nilai default waktu sendtime adalah waktu saat ini.
2. Batasi jumlah waktu pengiriman harian
Kita perlu menggunakan kelas antarmuka dan entitas yang disebutkan dalam artikel sebelumnya di sini.
DailyCountfilter.java
kelas publik DailyCountFilter mengimplementasikan smsfilter {private int ipdailyMaxsendCount; Private Int MobileDailyMaxSendCount; smsdao smsdao pribadi; // Beberapa kode yang tidak berguna dihilangkan @Override public boolean filter (smsentity smsentity) {if (smsdao.getMobileCount (smsentity.getMobile ())> = mobilileDyMaxsendCount) {return false; } if (smsdao.getipcount (smsentity.getip ())> = ipdailyMaxsendCount) {return false; } smsdao.saveEntity (smsentity); Kembali Benar; }}Kode utamanya sangat sederhana. Pertama, tentukan apakah jumlah kali yang dikirim ke nomor ponsel yang ditentukan telah mencapai jumlah maksimum waktu pengiriman, dan kemudian tentukan apakah berapa kali dikirim oleh permintaan IP yang ditentukan telah mencapai angka maksimum. Jika tidak satu pun dari mereka, simpan nomor ponsel, IP dan informasi lain yang dikirim kali ini ke database.
Tentu saja, ada masalah tertentu dengan kelas ini: utas lain mungkin telah menyimpan data baru antara menilai apakah angka maksimum melebihi angka maksimum dan data entitas yang disimpan. Ini menghasilkan dua penilaian di atas tidak sepenuhnya akurat.
Kita dapat menggunakan transaksi tingkat serialisasi untuk memastikan bahwa tidak akan ada kesalahan, tetapi biayanya terlalu tinggi. Karena itu, kami tidak akan melakukan pemrosesan di sini. Karena kami telah menerapkan membatasi frekuensi transmisi sebelumnya. Jika kita menggunakan FrequencyFilter untuk menyaring sekali dan membatasi frekuensi transmisi, maka masalah yang disebutkan di atas pada dasarnya tidak mungkin.
Ada masalah lain: seiring waktu, tabel ini akan menjadi lebih besar dan lebih besar, menghasilkan kinerja kueri yang agak buruk. Kita dapat menghapus data yang tidak berguna sesekali seperti yang kita lakukan di artikel sebelumnya; Kami juga dapat membuat tabel secara dinamis dan kemudian memasukkan data ke dalam tabel baru.
3. Gunakan tabel dinamis
Di sini kami mengadopsi solusi kedua: nama tabel data adalah "sms_four-digit tahun_two-digit bulan", seperti "SMS_2016_02". Saat memasukkan data, dapatkan nama tabel berdasarkan waktu saat ini, lalu masukkan. Selain itu, gunakan Kuarsa untuk menghasilkan tabel data untuk bulan berikutnya dan bulan depan pukul 2 pada tanggal 20 setiap bulan:
Kami pertama -tama memodifikasi kelas DailyCountFilter, menambahkan rencana tugas ke kelas ini, dan menghasilkan tabel data secara teratur:
DailyCountfilter.java
// Berdasarkan kode di atas, tambahkan kode kelas publik berikut DailyCountFilter mengimplementasikan smsfilter {private scheduler sched; @Override public void init () melempar scheduleRexception {smsdao.createTable (0); // Buat tabel data bulan ini smsdao.createTable (1); // Buat tabel data bulan depan SCRECTERERFACTORY SF = STDSCHEDURERFACTORY () baru; sfor = sf.getscheduler (); // buat wadah kuarsa jobdatamap jobDatamap = new jobDatamap (); jobDatamap.put ("smsdao", smsdao); // Buat peta data yang perlu digunakan saat menjalankan tugas // Buat objek pekerjaan, yang mengeksekusi tugas aktual jobdetail job = jobbuilder.newjob (createsmstableJob.class) .usingjobData (jobDatamap) .withidentity ("Buat pekerjaan meja SMS"). Build (); // Buat objek pemicu, yang digunakan untuk menggambarkan aturan waktu untuk memicu pelaksanaan pekerjaan // misalnya, crontrigger pemicu = triggerbuilder.newtrigger () .dua IDidentity ("Buat pemicu tabel SMS") .bidschedule (cronscheduleBuilder.cronscredule ("0 0 2 20 *?" sched.schedulejob (pekerjaan, pemicu); // daftarkan tugas dan picu aturan sched.start (); // Mulai penjadwalan} @Override public void dashare () {coba {sched.shutdown (); } Catch (SCHECTEREREXCEPTION E) {}} Public Static Class CreateSMStableJob mengimplementasikan JOB {@Override public void execute (JobexecutionContext Context) melempar JobExecutionException {jobDataMap datamap = context.getjObDetail (). getjobdataMap (); Smsdao smsdao = (smsdao) datamap.get ("smsdao"); // Dapatkan objek SMSDAO yang disahkan Smsdao.createTable (1); // buat tabel data bulan depan smsdao.createTable (2); // Buat tabel data bulan depan}}}Selanjutnya, mari kita lihat beberapa kode SMSDAO:
Smsdao.java
Kelas Publik SMSDAO { / *** Buat tabel log baru** @param MonthExcursion Jumlah bulan offset* / public void createTable (int monthexCursion) {string sql = "buat tabel jika tidak ada" + getTablename (MonthexCursion) + "seperti sms"; // Jalankan pernyataan SQL}/ *** Simpan objek entitas smsentity*/ public void saveEntity (smsentity smsentity) {string sql = "masukkan ke" + getNowTableName () + "(seluler, ip, type) nilai (?,?,?)"; // Execute the sql statement} /** * Get the specified mobile number and request the SMS today* * @param mobile user mobile number * @return Number of times request the SMS today*/ public long getMobileCount(String mobile){ String sql = "SELECT count(id) FROM " + getNowTableName() + " WHERE mobile=? AND time >= CURDATE()"; // Jalankan pernyataan SQL dan kembalikan hasil kueri} // Metode getipcount dihilangkan/ *** Dapatkan nama tabel yang digunakan sekarang*/ string privat getNowLename () {return getTableName (0); } private dateFormat dateFormat = new SimpleDateFormat ("yyyy_mm"); / *** Dapatkan nama tabel bulan offset bulan*** @param MonthExcursion Jumlah bulan offset* @return Tabel Nama Bulan yang sesuai*/ Private String getTableName (int MonthExcursion) {Calendar Calendar = calendar.getInstance (); Calendar.Add (Calendar.month, MonthExcursion); Tanggal tanggal = calendar.getTime (); return "sms_" + dateFormat.format (tanggal); }}Ada prasyarat untuk keberhasilan operasi metode createtable di SMSDAO, yaitu ada tabel data SMS. Metode createTable akan menyalin struktur tabel SMS untuk membuat tabel data baru.
Kami menyimpan data untuk mengirim pesan teks (nomor ponsel, IP, waktu, dll.) Alih -alih secara langsung menghapusnya, karena kami mungkin perlu menganalisis data ini di masa depan untuk mendapatkan informasi yang kami inginkan, seperti menilai tingkat kedatangan SMS penyedia layanan, apakah seseorang mengirim pesan teks dengan jahat, dll. Kita bahkan mungkin mendapatkan "kejutan" yang tidak terduga.
Di atas adalah semua tentang artikel ini, saya harap Anda dapat terus memperhatikan.