Di bagian sebelumnya, kami menyelesaikan antarmuka UI Halaman Beranda, tetapi ada masalah: jika saya menambahkan produk di latar belakang, maka saya harus memulai kembali server untuk menyinkronkan kembali data latar belakang, dan kemudian menyegarkan halaman beranda untuk menyinkronkan data. Ini jelas bukan efek yang kita inginkan. Secara umum, beranda mal online semacam ini jelas bukan data yang disinkronkan secara manual, jadi bagaimana cara menyelesaikannya? Kita perlu menggunakan utas dan timer untuk secara otomatis menyinkronkan data beranda secara otomatis.
1. Timer dan Timertask
Kita perlu menggunakan kelas timer dan timertask. Mari kita perkenalkan kedua kategori ini terlebih dahulu.
Timer adalah kelas alat. Dalam paket java.util, utas menggunakannya untuk mengatur tugas yang akan dieksekusi di utas latar belakang nanti. Tugas dapat dieksekusi sekali, atau mereka dapat dieksekusi secara teratur. Itu memiliki konstruktor:
Timer (Boolean Isdaemon) // Buat timer baru yang dapat menentukan utas terkait untuk dijalankan sebagai daemon.
Setelah utas daemon, yaitu, utas utama berakhir, utas juga berakhir, dan setelah utas non-daemon, yaitu, utas utama berakhir, utas terus dijalankan. Ketika Isdaemon benar, itu adalah benang daemon. Kelas timer memiliki metode jadwal yang dapat membuat tugas, sebagai berikut:
void jadwal (Tugas Timertask, tanggal pertama kali, periode panjang) // Jadwalkan tugas yang ditentukan untuk melakukan eksekusi penundaan tetap berulang pada waktu yang ditentukan. // Parameter pertama adalah tugas yang ditentukan, yaitu objek TimerTask; Parameter kedua adalah waktu pembukaan tugas pertama; Parameter ketiga adalah interval waktu, yaitu, berapa lama waktu yang dibutuhkan untuk mengeksekusi setiap waktu
Mari kita lihat Timertask. Timertask digunakan untuk membuat tugas utas baru. Ini mengimplementasikan antarmuka yang dapat dijalankan. Jika kita ingin membuat tugas utas baru, kita hanya perlu mewarisi timertask dan menulis ulang metode run.
2. Buat tugas utas baru
Mari kita buat tugas utas baru untuk memperbarui data latar belakang:
@Component // Serahkan objek ke manajemen musim semi ProductTimerTask memperluas timerKask {@Resource private productservice ProductService = null; // menyuntikkan ProductService @Resource Private CategoryService CategoryService = null; // menyuntikkan CategoryService Private ServletContext Application = NULL; // Tentukan objek ServletContext, karena setelah kita memperbarui data latar belakang, kita perlu menyimpannya di domain aplikasi void setApplication (Aplikasi ServletContext) {this.application = Application; // Atur objek aplikasi ini melalui pendengar, karena objek aplikasi tidak dapat diambil di sini} @Override // Logika yang sama dengan inisialisasi data pendengar ketika proyek memulai public void run () {System.out.println ("--------"); Daftar <Daftar <Product>> BigList = ArrayList baru <Daftar <Product>> (); // penyimpanan daftar dengan kelas kategori dalam biglist // 1. Query out kategori panas untuk (kategori kategori: kategoriService.querybyhot (true)) {// Dapatkan informasi produk yang disarankan berdasarkan daftar ID kategori panas <product> lst = productervice.quaByCategoryId (kategori.getid (); biglist.add (lst); // Masukkan daftar dengan kategori di BigList} // 2. Tinggalkan Biglist Query ke Aplikasi Built-in Object.setAttribute ("BigList", BigList); // Misalkan kita mendapatkan objek aplikasi}}Selanjutnya, kami memodifikasi isi pendengar ketika proyek dimulai. Operasi kueri asli di atas ditempatkan di pendengar. Ketika proyek dimulai, pendengar mulai mengeksekusi, mendapatkan data latar belakang, dan menyimpannya di domain aplikasi. Kemudian latar depan mendapatkan data dari domain aplikasi melalui tag JSTL. Sekarang kami menyerahkan hal -hal ini kepada ProductTimerTask yang kami tetapkan, jadi cukup atur timer di pendengar dan biarkan ProductTimertask memperbarui data latar belakang secara teratur. Lihat kode yang dimodifikasi di pendengar:
3. Mulai timer di pendengar
//@komponen // pendengar adalah komponen dari lapisan web. Ini dipakai oleh Tomcat, bukan musim semi. Tidak dapat dimasukkan ke dalam musim semi kelas publik initDataListenerer mengimplementasikan servletcontextListener {private productTimertask productTimertask = null; // Tentukan ProductTimertask Object Private ApplicationContext Context = NULL; @Override public void contextDestroyed (event servletContextEvent) {// toddo metode yang dihasilkan secara otomatis} @Override public void contextInitialized (SERVLETContextEvent event) {contextcontext () ());) ;getWebApplicationContex ProductTimertask = (ProductTimertask) Context.getBean ("ProductTimertask"); // Dapatkan objek ProductTimertask dari file konfigurasi // Bicara objek bawaan ke ProductTimertask, karena ProductTimertask tidak dapat memperoleh aplikasi, Anda hanya dapat memberikannya melalui pendengar yang ditetapkan ()) karena) (events.getServetcerc (EventServletc (events.getServletc (eventServletc (events.getservletc (eventserxervetc (eventserextc (eventserextc (events.getServetc ((eventServetc (eventServletc; // Atur timer untuk menyinkronkan data di beranda sekali setiap jam (dikonfigurasi sebagai utas daemon) timer baru (true) .schedule (ProductTimertask, 0, 1000*60*60); // Jalankan Tugas ProductTimertask sekali setiap jam, yaitu, perbarui data latar belakang}}} Mengenai kode operasi asli dalam pendengar InitDataListener, Anda dapat membandingkan konten di bagian sebelumnya. Bahkan, ini adalah data latar belakang pembaruan di ProductTimertask, tetapi hanya dimasukkan ke Timertask untuk saat ini. Dengan cara ini, kami menyelesaikan penggunaan utas dan pengatur waktu untuk secara teratur menyinkronkan data beranda, dan interval waktu ini dapat ditetapkan oleh diri kita sendiri.
Bahkan, beberapa data beranda di blog CSDN tidak diperbarui secara real time. Akan ada waktu untuk memperbarui setiap malam, seperti peringkat blog di kolom kiri, jumlah tampilan yang ditampilkan setelah membaca peringkat, dll. Ini diperbarui setiap malam, dan harus diatur di latar belakang untuk memperbarui sekali sehari. Prinsipnya harus sama seperti di sini. Ini juga mengurangi tekanan pada server.
Tautan ke artikel ini: http://blog.csdn.net/eson_15/article/details/51387378
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.