Secara peribadi, saya merasakan bahawa semua pemasaan perisian dilakukan melalui tinjauan pendapat, dan membuka urutan untuk melaksanakan tugas sedemikian memerlukan lebih banyak sumber, saya rasa penyelesaian berikut mungkin mempunyai prestasi yang lebih baik.
0. Pertama, kami memerlukan "siaran berjadual" yang menghantar siaran setiap 5 minit 1 Apabila pengguna mendaftar, kami mendaftarkan pendengar untuk mendengar "siaran berjadual" 2 pengguna Klik alamat pengaktifan dalam peti mel untuk menutup pendengar yang didaftarkan sebelum ini 3. Jika pendengar menerima siaran untuk kali kedua, tugas akan dilaksanakan dan pendengaran akan dibatalkan
Sebab tugasan mesti dilaksanakan apabila siaran diterima buat kali kedua adalah untuk memastikan tugas itu dapat dilaksanakan selepas 5 hingga 10 minit. Sudah tentu, ini tidak dapat menjamin masa yang tepat Jika anda perlu meningkatkan ketepatan masa, anda boleh menyiarkan sekali setiap minit, atau sekali setiap saat, tetapi senario ini tidak perlu.
Untuk melaksanakan siaran berjadual, anda boleh menggunakan alatan seperti kuarza, atau juga menggunakan baris gilir mesej untuk memisahkan perniagaan ini.
Semoga ia membantu, jika ada bahagian yang tidak sesuai atau salah sila komen
Gunakan pemasa spring untuk melengkapkannya pada lapisan perkhidmatan Terdapat medan dalam pangkalan data yang 0 apabila didaftarkan, pemasa musim bunga dipanggil Selepas lima minit, medan ini dalam pangkalan data akan diimbas setiap beberapa saat dan dijana. Pengguna kod pengesahan mengklik alamat dalam peti mel untuk menghentikan pemasa. Saya boleh memberi anda dokumentasi dan kod pemasa musim bunga
Tampal bahagian pemasa asli dan pencetus jdk dan TimerTask ialah perkara utama Daftar pendengar apabila pemasa memanggil jadual atau memanggilnya dengan kaedah lain, sila rujuk kepada pembangunan JDK dokumentasi. Terdapat arahan terperinci dalam dokumentasi. Demo kecil saya ini tidak membatalkan tugas.
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Demo {
public static void main(String[] args) {
Timer timer = new Timer();
Long long1 =new Long("1486308200000");
timer.schedule(new TaskDemo(), new Date(long1));
}
}
class TaskDemo extends TimerTask{
@Override
public void run() {
System.out.println("点前时间是"+new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()));
}
}
Pemasa sekali jenis ini lebih sesuai untuk dilaksanakan menggunakan baris gilir mesej. Ia agak mudah untuk dilaksanakan, dan terdapat penyelesaian yang matang. Baris gilir mesej seperti: RabbitMQ, ActiveMQ, RocketMQ
Ada sesuatu yang tidak kena dengan reka bentuk anda:
Menurut reka bentuk anda, setiap pendaftaran pengguna mesti memulakan tugas yang dijadualkan, jadi bagaimana jika sebilangan besar pengguna mendaftar? Tugas berjadual sebenarnya adalah satu utas Memulakan sejumlah besar utas akan menggunakan terlalu banyak sumber CPU.
Pengguna mengklik pada alamat e-mel untuk mengaktifkan alamat dan kemudian memusnahkannya. Jika anda menyimpan tugas berjadual dalam JVM, ia berkemungkinan gagal semasa penggunaan kluster kerana anda tidak dapat menjamin bahawa pengguna mengakses tika JVM yang sama semasa pendaftaran dan pengaktifan.
Tugas yang dijadualkan mendapati bahawa pengguna tidak diaktifkan, dan kemudian menjana semula kod pengesahan. Mengapakah ia perlu dijana sebelum pengguna seterusnya mengklik untuk menghantar e-mel?
Saya rasa reka bentuk yang lebih baik sepatutnya seperti ini:
Pendaftaran pengguna, status pengaktifan pengguna = Tidak
Pengguna mengklik [Hantar E-mel Pengaktifan], dan url pengaktifan dijana di latar belakang Url disertakan dengan uuid ini dikaitkan dengan nama pengguna, disimpan (uuid, nama pengguna, tamat tempoh masa), dan kemudian e-mel dihantar
Pengguna mengklik url pengaktifan dalam e-mel dan mengakses aplikasi anda
Aplikasi anda mendapat uuid dalam URL untuk melihat sama ada ia wujud dalam pangkalan data dan belum tamat tempoh. Jika ya, dapatkan nama pengguna yang berkaitan, kemas kini status pengaktifan pengguna = benar, dan padam uuid jika tidak, lakukan apa-apa.
storan uuid:
boleh disimpan dalam pangkalan data, tetapi untuk membersihkan data yang telah tamat tempoh, anda boleh membuka utas (hanya satu) yang berasingan dan menjalankannya setiap 1 minit untuk memadam uuid yang telah tamat tempoh dalam pangkalan data.
juga boleh disimpan dalam redis Redis mempunyai ciri yang boleh anda tentukan ttl data itu akan dipadamkan secara automatik apabila ia tamat tempoh, jadi tidak perlu membuka benang berasingan untuk membersihkannya tamat tempoh uuid.
Secara peribadi, saya merasakan bahawa semua pemasaan perisian dilakukan melalui tinjauan pendapat, dan membuka urutan untuk melaksanakan tugas sedemikian memerlukan lebih banyak sumber, saya rasa penyelesaian berikut mungkin mempunyai prestasi yang lebih baik.
0. Pertama, kami memerlukan "siaran berjadual" yang menghantar siaran setiap 5 minit
1 Apabila pengguna mendaftar, kami mendaftarkan pendengar untuk mendengar "siaran berjadual"
2 pengguna Klik alamat pengaktifan dalam peti mel untuk menutup pendengar yang didaftarkan sebelum ini
3. Jika pendengar menerima siaran untuk kali kedua, tugas akan dilaksanakan dan pendengaran akan dibatalkan
Sebab tugasan mesti dilaksanakan apabila siaran diterima buat kali kedua adalah untuk memastikan tugas itu dapat dilaksanakan selepas 5 hingga 10 minit. Sudah tentu, ini tidak dapat menjamin masa yang tepat Jika anda perlu meningkatkan ketepatan masa, anda boleh menyiarkan sekali setiap minit, atau sekali setiap saat, tetapi senario ini tidak perlu.
Untuk melaksanakan siaran berjadual, anda boleh menggunakan alatan seperti kuarza, atau juga menggunakan baris gilir mesej untuk memisahkan perniagaan ini.
Semoga ia membantu, jika ada bahagian yang tidak sesuai atau salah sila komen
Gunakan pangkalan data untuk mengundi, dan padamkan rekod yang sepadan jika diklik
Gunakan pemasa spring untuk melengkapkannya pada lapisan perkhidmatan Terdapat medan dalam pangkalan data yang 0 apabila didaftarkan, pemasa musim bunga dipanggil Selepas lima minit, medan ini dalam pangkalan data akan diimbas setiap beberapa saat dan dijana. Pengguna kod pengesahan mengklik alamat dalam peti mel untuk menghentikan pemasa. Saya boleh memberi anda dokumentasi dan kod pemasa musim bunga
Tampal bahagian pemasa asli dan pencetus jdk dan TimerTask ialah perkara utama Daftar pendengar apabila pemasa memanggil jadual atau memanggilnya dengan kaedah lain, sila rujuk kepada pembangunan JDK dokumentasi. Terdapat arahan terperinci dalam dokumentasi. Demo kecil saya ini tidak membatalkan tugas.
Pemasa sekali jenis ini lebih sesuai untuk dilaksanakan menggunakan baris gilir mesej. Ia agak mudah untuk dilaksanakan, dan terdapat penyelesaian yang matang. Baris gilir mesej seperti: RabbitMQ, ActiveMQ, RocketMQ
Ada sesuatu yang tidak kena dengan reka bentuk anda:
Menurut reka bentuk anda, setiap pendaftaran pengguna mesti memulakan tugas yang dijadualkan, jadi bagaimana jika sebilangan besar pengguna mendaftar? Tugas berjadual sebenarnya adalah satu utas Memulakan sejumlah besar utas akan menggunakan terlalu banyak sumber CPU.
Pengguna mengklik pada alamat e-mel untuk mengaktifkan alamat dan kemudian memusnahkannya. Jika anda menyimpan tugas berjadual dalam JVM, ia berkemungkinan gagal semasa penggunaan kluster kerana anda tidak dapat menjamin bahawa pengguna mengakses tika JVM yang sama semasa pendaftaran dan pengaktifan.
Tugas yang dijadualkan mendapati bahawa pengguna tidak diaktifkan, dan kemudian menjana semula kod pengesahan. Mengapakah ia perlu dijana sebelum pengguna seterusnya mengklik untuk menghantar e-mel?
Saya rasa reka bentuk yang lebih baik sepatutnya seperti ini:
Pendaftaran pengguna, status pengaktifan pengguna = Tidak
Pengguna mengklik [Hantar E-mel Pengaktifan], dan url pengaktifan dijana di latar belakang Url disertakan dengan uuid ini dikaitkan dengan nama pengguna, disimpan (uuid, nama pengguna, tamat tempoh masa), dan kemudian e-mel dihantar
Pengguna mengklik url pengaktifan dalam e-mel dan mengakses aplikasi anda
Aplikasi anda mendapat uuid dalam URL untuk melihat sama ada ia wujud dalam pangkalan data dan belum tamat tempoh. Jika ya, dapatkan nama pengguna yang berkaitan, kemas kini status pengaktifan pengguna = benar, dan padam uuid jika tidak, lakukan apa-apa.
storan uuid:
boleh disimpan dalam pangkalan data, tetapi untuk membersihkan data yang telah tamat tempoh, anda boleh membuka utas (hanya satu) yang berasingan dan menjalankannya setiap 1 minit untuk memadam uuid yang telah tamat tempoh dalam pangkalan data.
juga boleh disimpan dalam redis Redis mempunyai ciri yang boleh anda tentukan ttl data itu akan dipadamkan secara automatik apabila ia tamat tempoh, jadi tidak perlu membuka benang berasingan untuk membersihkannya tamat tempoh uuid.