Saya menggunakan Java dan saya ingin membuat servlet terus berjalan di aplikasi saya, tetapi saya tidak mengerti cara melakukannya. Servlet saya memiliki metode yang memberikan jumlah pengguna dari database setiap hari serta jumlah total pengguna dari seluruh database. Jadi saya ingin terus menjalankan servlet untuk itu.
97
Jawaban:
Masalah Anda adalah bahwa Anda salah memahami tujuan servlet . Itu dimaksudkan untuk bertindak atas permintaan HTTP, tidak lebih. Anda hanya menginginkan tugas latar belakang yang dijalankan sekali setiap hari.
EJB tersedia? Menggunakan
@Schedule
Jika lingkungan Anda kebetulan mendukung EJB (yaitu server Java EE nyata seperti WildFly, JBoss, TomEE, Payara, GlassFish, dll), gunakan
@Schedule
saja. Berikut beberapa contohnya:Ya, itu saja. Penampung akan secara otomatis mengambil dan mengelolanya.
EJB tidak tersedia? Menggunakan
ScheduledExecutorService
Jika lingkungan Anda tidak mendukung EJB (yaitu Anda tidak menggunakan server Java EE yang sebenarnya, tetapi penampung server barebone seperti Tomcat, Jetty, dll), maka gunakan
ScheduledExecutorService
. Ini dapat dimulai dengan aServletContextListener
. Inilah contoh awal:Dimana kelas pekerjaan terlihat seperti ini:
Jangan pernah berpikir untuk menggunakan
java.util.Timer
/java.lang.Thread
dalam lingkungan berbasis Java EE / ServletLast but not least, jangan pernah langsung menggunakan
java.util.Timer
dan / ataujava.lang.Thread
di Java EE. Ini resep untuk masalah. Penjelasan terperinci dapat ditemukan dalam jawaban terkait JSF ini pada pertanyaan yang sama: Memijahkan utas dalam kacang yang dikelola JSF untuk tugas terjadwal menggunakan pengatur waktu .sumber
ScheduledExecutorService
: Pastikan untuk menangkap semua pengecualian di pelaksana Anda. Jika pengecualian lolos darirun
metode Anda , pelaksana akan berhenti mengeksekusi secara diam-diam. Ini adalah fitur bukan bug. Baca dokumen dan pelajari dengan beberapa googling.scheduler.shutdownNow()
tidak dipanggil dengan benar sesuai contoh. Jika ini tidak dipanggil, utas jadwal memang akan terus berjalan.Saya akan menyarankan menggunakan perpustakaan seperti kuarsa untuk menjalankan tugas secara berkala. Apa yang sebenarnya dilakukan servlet? Ini mengirimi Anda laporan?
sumber
Menerapkan dua kelas dan memanggil
startTask()
dimain
.sumber
Anda dapat menggunakan cron4j. http://www.sauronsoftware.it/projects/cron4j/manual.php
sumber
Dalam sistem produksi yang mungkin menjalankan beberapa kontainer non-jee. Gunakan penjadwal perusahaan lain seperti penjadwal Quartz yang dapat dikonfigurasi untuk menggunakan database untuk tugas maamgememt.
sumber