1. Prinsip Implementasi Dasar Penjadwalan Tugas Kuarsa
Quartz adalah proyek open source di bidang penjadwalan tugas oleh OpenSymphony, yang sepenuhnya didasarkan pada implementasi Java. Sebagai kerangka penjadwalan sumber terbuka yang sangat baik, Kuarsa memiliki fitur -fitur berikut:
(1) Fungsi penjadwalan yang kuat, seperti mendukung berbagai metode penjadwalan, dapat memenuhi berbagai kebutuhan konvensional dan khusus;
(2) metode aplikasi yang fleksibel, seperti mendukung beberapa kombinasi tugas dan penjadwalan, dan mendukung beberapa metode penyimpanan data penjadwalan;
(3) Kemampuan terdistribusi dan pengelompokan, terakota lebih lanjut telah meningkatkan fungsi aslinya setelah akuisisi. Artikel ini akan menambahkan hingga bagian ini.
1.1 Elemen Inti Kuarsa
Elemen inti penjadwalan tugas kuarsa adalah: Penjadwal Penjadwal-Tugas, Pemicu Pemicu, dan tugas-tugas. Di mana pemicu dan pekerjaan adalah metadata untuk penjadwalan tugas, dan penjadwal adalah pengontrol yang benar -benar melakukan penjadwalan.
Pemicu adalah elemen yang digunakan untuk menentukan waktu penjadwalan, yaitu, sesuai dengan aturan waktu yang dijalankan. Ada empat jenis pemicu di kuarsa: Simpletrigger, Crontirgger, DateInterValtrigger, dan NThincludedDaytrigger. Keempat pemicu ini dapat memenuhi sebagian besar kebutuhan aplikasi perusahaan.
Pekerjaan digunakan untuk mewakili tugas yang dijadwalkan. Terutama ada dua jenis pekerjaan: stateless dan stateful. Untuk pemicu yang sama, pekerjaan yang stateful tidak dapat dieksekusi secara paralel. Hanya setelah tugas yang dipicu terakhir dieksekusi, eksekusi berikutnya dapat dipicu. Pekerjaan memiliki dua atribut utama: volatile dan daya tahan, di mana volatil berarti apakah tugas tersebut tetap ada pada penyimpanan basis data, sementara daya tahan berarti apakah tugas tersebut dipertahankan ketika tidak ada hubungan pemicu. Keduanya bertahan atau dilestarikan ketika nilainya benar. Pekerjaan dapat dikaitkan dengan beberapa pemicu, tetapi pemicu hanya dapat mengaitkan satu pekerjaan.
Penjadwal dibuat oleh Factory Penjadwal: DirectSchedulerFactory atau StdschedulerFactory. Pabrik kedua, StdschedulerFactory, digunakan lebih sering karena DirectschedulerFactory tidak cukup nyaman untuk digunakan, dan banyak pengaturan pengkodean manual terperinci diperlukan. Ada tiga jenis penjadwal utama: Remotembeanscheduler, Remotescheduler dan Stdscheduler.
Hubungan antara elemen inti kuarsa ditunjukkan pada Gambar 1.1:
Gambar 1.1 Diagram Hubungan Elemen Inti
1.2 tampilan utas kuarsa
Di kuarsa, ada dua jenis utas, utas penjadwal penjadwal dan utas eksekusi tugas, di mana utas eksekusi tugas biasanya menggunakan kumpulan utas untuk memelihara sekelompok utas.
Gambar 1.2 Tampilan Thread Kuarsa
Ada dua utas utama untuk penjadwal: utas yang melakukan penjadwalan reguler dan utas yang menjalankan misfiredtrigger. Polling utas pengiriman reguler yang disimpan semua pemicu. Jika ada pemicu yang perlu dipicu, yaitu, waktu pemicu berikutnya telah tercapai, ia memperoleh benang idle dari kumpulan utas eksekusi tugas untuk menjalankan tugas yang terkait dengan pemicu. Thread Misfire memindai semua pemicu untuk melihat apakah ada triggrigger yang salah. Jika demikian, itu ditangani secara terpisah sesuai dengan kebijakan misfire (api sekarang atau tunggu api berikutnya).
1.3 Penyimpanan Data Pekerjaan Kuarsa
Pemicu dan pekerjaan di kuarsa perlu disimpan sebelum dapat digunakan. Ada dua metode penyimpanan di kuarsa: Ramjobstore dan Jobstoresupport, di mana Ramjobstore menyimpan pemicu dan pekerjaan dalam memori, sementara JobStoresupport menyimpan pemicu dan pekerjaan dalam database berdasarkan JDBC. RAMJOBSTORE adalah akses yang sangat cepat, tetapi karena semua data akan hilang setelah sistem dihentikan, JobStoresupport harus digunakan dalam aplikasi cluster.
2. Kuarsa Cluster Prinsip 2.1 Arsitektur Cluster Kuarsa
Setiap node dalam cluster kuarsa adalah aplikasi kuarsa independen, yang pada gilirannya mengelola node lain. Ini berarti Anda harus memulai atau menghentikan setiap node secara terpisah. Dalam cluster kuarsa, node kuarsa independen tidak berkomunikasi dengan simpul atau node manajemen lain, tetapi sebaliknya merasakan aplikasi kuarsa lain melalui tabel database yang sama, seperti yang ditunjukkan pada Gambar 2.1.
Gambar 2.1 Arsitektur Cluster Kuarsa
2.2 Tabel Database Terkait Cluster Kuarsa
Karena cluster kuarsa tergantung pada database, perlu untuk terlebih dahulu membuat tabel database kuarsa. Paket rilis kuarsa mencakup skrip SQL untuk semua platform database yang didukung. Script SQL ini disimpan di direktori <pruartz_home>/docs/dbtables. Versi Kuarsa 1.8.4 yang digunakan di sini memiliki total 12 tabel. Jumlah tabel mungkin berbeda dalam versi yang berbeda. Basis data adalah MySQL, dan gunakan TABLE_MYSQL.SQL untuk membuat tabel basis data. Semua tabel ditunjukkan pada Gambar 2.2, dan pengantar singkat untuk tabel ini ditunjukkan pada Gambar 2.3.
Gambar 2.2 Tabel yang dihasilkan dalam kuarsa 1.8.4 di database MySQL
Gambar 2.3 Pengantar Tabel Data Kuarsa
2.2.1 Tabel Status Penjadwal (qrtz_scheduler_state)
Deskripsi: Informasi instance simpul di cluster, kuarsa membaca informasi tabel ini secara teratur untuk menentukan status saat ini dari setiap instance di cluster.
Instance_name: Nama yang dikonfigurasi oleh org.quartz.scheduler.instanceID dalam file konfigurasi. Jika diatur ke Auto, Kuarsa akan menghasilkan nama berdasarkan nama mesin fisik dan waktu saat ini.
last_checkin_time: waktu check-in terakhir
checkin_interval: waktu interval check-in
2.2.2 Tabel Asosiasi Pemicu dan Tugas (qrtz_fired_triggers)
Menyimpan informasi status yang terkait dengan pemicu yang dipicu dan informasi eksekusi dari pekerjaan terkait.
2.2.3 Tabel Informasi Pemicu (QRTZ_TRIGGERS)
trigger_name: nama pemicu, pengguna dapat menyesuaikan nama sesuka hati, tidak ada persyaratan paksa
Trigger_Group: Nama grup pemicu, yang dapat disesuaikan pengguna sesuka hati, dan tidak ada persyaratan paksa.
job_name: Kunci asing qrtz_job_details tabel job_name
job_group: qrtz_job_details tabel job_group kunci asing
Trigger_State: Status pemicu saat ini diatur untuk diperoleh. Jika diatur untuk menunggu, pekerjaan itu tidak akan memicu.
trigger_cron: tipe pemicu, menggunakan ekspresi cron
2.2.4 Tabel Detail Tugas (qrtz_job_details)
Catatan: Simpan detail pekerjaan, tabel perlu diinisialisasi oleh pengguna sesuai dengan situasi aktual
Job_name: Nama pekerjaan di cluster. Pengguna dapat menyesuaikan nama sesuka hati, tanpa persyaratan paksa.
Job_group: Nama grup tempat pekerjaan itu berada di cluster, yang disesuaikan oleh pengguna sesuka hati, dan tidak ada persyaratan paksa.
job_class_name: Nama paket lengkap dari kelas implementasi pekerjaan di cluster. Kuarsa menemukan kelas pekerjaan berdasarkan jalur ini ke Classpath.
is_dable: apakah akan bertahan, atur properti ini ke 1, kuarsa akan bertahan di database
Job_data: Bidang gumpalan yang menyimpan benda -benda pekerjaan tetap ada.
2.2.5 Tabel Informasi Izin (qrtz_locks)
Catatan: Ada inisialisasi DML yang sesuai di Tables_oracle.sql, seperti yang ditunjukkan pada Gambar 2.4.
Gambar 2.4 Informasi Inisialisasi di Tabel Informasi Izin Kuarsa
2.3 Proses Startup Penjadwal Kuarsa di Cluster
Quartz Scheduler sendiri tidak memperhatikan bahwa itu dikelompokkan, dan hanya JDBC Jobstore yang dikonfigurasi untuk Penjadwal yang akan tahu. Ketika penjadwal kuarsa dimulai, ia memanggil metode penjadwalan () dari Jobstore, yang memberi tahu Jobstore Scheduler bahwa itu telah dimulai. Metode penjadwalan () diimplementasikan di kelas UNGGA PERJALANAN. Kelas UPPORTSUPPORT menentukan apakah instance penjadwal berpartisipasi dalam cluster berdasarkan pengaturan dalam file quartz.properties. Jika cluster dikonfigurasi, instance dari kelas clustermanager baru akan dibuat, diinisialisasi dan dimulai. ClusterManager adalah kelas inline di kelas UNCORESUPPORT, mewarisi java.lang.thread, berjalan secara teratur dan melakukan fungsi check-in pada instance penjadwal. Penjadwal juga perlu memeriksa apakah node cluster lain telah gagal. Siklus eksekusi operasi check-in dikonfigurasi di kuarsa.properties.
2.4 Mendeteksi node penjadwal yang gagal
Ketika instance penjadwal melakukan check-in, ia memeriksa apakah instance penjadwal lain belum diperiksa pada saat yang mereka harapkan. Ini ditentukan dengan memeriksa apakah nilai penjadwal yang direkam di kolom Last_Chedk_Time di tabel SCHARTERER_STATE lebih awal dari org.quartz.jobstore.clustercheckinInterval. Jika satu atau lebih node belum diperiksa pada waktu yang telah ditentukan, maka penjadwal berjalan mengasumsikan bahwa mereka telah gagal.
2.5 Pekerjaan Memulihkan dari Instance Gagal
Ketika instance Sheduler gagal saat menjalankan pekerjaan, ada kemungkinan bahwa instance penjadwal kerja lain akan mengambil pekerjaan dan menjalankannya lagi. Untuk mencapai perilaku ini, properti pemulihan pekerjaan yang dikonfigurasi ke objek JobDetail harus diatur ke true (job.setRequestSrecovery (true))). Jika properti yang dapat dipulihkan diatur ke false (default false), itu tidak akan diulang ketika penjadwal gagal menjalankan pekerjaan; Ini akan dipicu oleh instance penjadwal lain pada waktu pemicu berikutnya. Seberapa cepat instance penjadwal dapat dideteksi setelah kegagalan tergantung pada interval check-in dari setiap penjadwal (mis. Org.quartz.jobstore.clustercheckinInterval yang disebutkan dalam 2.3).
3. Kuarsa Cluster Instance (Quartz+Spring)
3.1 Musim semi tidak sesuai dengan masalah kuarsa
Musim semi tidak lagi mendukung kuarsa sejak 2.0.2. Secara khusus, ketika Quartz+Spring Instantiates Tugas Quartz ke dalam database, kesalahan serializable akan terjadi:
<bean id = "jobTask"> <name properti = "targetObject"> <ref bean = "quartzjob"/> </property> <properti name = "targetMethod"> <value> eksekutasi </ value> </propert> </ bean>
Metode MethodInvoking dalam MethodInvokingJoBDetailFactoryBean Class tidak mendukung serialisasi, sehingga akan melempar kesalahan saat membuat serialisasi tugas kuarsa ke dalam database.
Pertama, selesaikan masalah MethodInvokingjoBdetailFactoryBean. Tanpa memodifikasi kode sumber pegas, Anda dapat menghindari menggunakan kelas ini dan secara langsung memanggil JobDetail. Namun, menggunakan implementasi JobDetail mengharuskan Anda untuk mengimplementasikan logika mothodinvoking sendiri. Anda dapat menggunakan properti JobClass dan JobDataasmap dari JobDetail untuk menyesuaikan pabrik (manajer) untuk mencapai tujuan yang sama. Misalnya, dalam contoh ini, myDetailquartzjobbean baru dibuat untuk mengimplementasikan fungsi ini.
3.2 File MyDetailquartzjobbean.java
Paket org.lxh.mvc.jobbean; import java.lang.reflect.method; impor org.apache.commons.logging.log; import org.apache.commons.logging.logfactory; impor org.quartz.jobexecutionContext; impor org.cuarceptexcepionpeptEcceptext; impor org org.springframework.context.applicationContext; impor org.springframework.scheduling.quartz.quartzjobbean; kelas publik mydetailquartzjobbean memperluas kuarsacclass () (); Private String TargetObject; Private String TargetMethod; Private ApplicationContext CTX; Protected Void ExecuteInternal (Konteks JobExecutionContext) melempar JobExecutionException {coba {logger.info ("Execute [" + TargetObject + "] sekaligus >>>>>"); Object oargetObject = ctx.getBean (targetObject); Metode m = null; coba {m = oargetObject.getClass (). getMethod (targetMethod, kelas baru [] {}); m.invoke (oargetObject, objek baru [] {}); } catch (SecurityException e) {logger.error (e); } catch (nosuchmethodeException e) {logger.error (e); }} catch (Exception e) {lempar JobExecutionException baru (e); }} public void setApplicationContext (ApplicationContext ApplicationContext) {this.ctx = ApplicationContext; } public void setargetObject (String targetObject) {this.targetObject = targetObject; } public void setTargetMethod (String targetMethod) {this.targetMethod = targetMethod; }}3.3 Kelas Implementasi Pekerjaan Nyata
Di kelas pengujian, fungsi mencetak waktu saat ini dari sistem hanya diimplementasikan.
Paket org.lxh.mvc.job; import java.io.serializable; import java.util.date; import org.apache.commons.logging.log; impor org.apache.commons.logging.logfactory; uji kelas publik mengimplementasikan serial {private logger = log. SerialVersionuid Long Statis Pribadi = -207331058649744415L; public void execute () {date date = new date (); System.out.println (date.tolocalestring ()); }}3.4 Konfigurasikan file Quartz.xml
<bean id = "test" scope = "prototipe"> </ bean> <bean id = "testjoBtask"> <name properti = "jobclass"> <value> org.lxh.mvc.jobbean.mydatailpy = "value </value </value </properti </properties name =" jobDatamap = "" maMerobbean </value </value </properti </property name = "jobDataMap =" "" maMerBeAb </value> </properti </properti </property name = "jobDataMap =" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""AURY" "" key = "targetMethod" value = "execute"/> </pap> </pruptent> </tact> <bean name = "testtrigger"> <name properti = "jobdetail" ref = "testjoBtask"/> <nama properti = "cronexpression" value = "0/1 * * * *?" /> </bean> <bean id = "quartzscheduler"> <properti name = "configlocation" value = "classpath: quartz.properties"/> <name properti = "triggers"> <cist> <Ref bean = "testtrigger"/> </list> </properties nama properti = "applicationckey =" applicationckey = "applicationckkey =" NAVEOX = "APLEKSIPKEX =" APLEKSIT/"NAVEOX =" APLEKSIPKEX = "APLEKTIF/BEANCEXTEXS =" APLEKTIF/BEANCEXTEXS = "APLEKTOR/" APLIKPLEXKEX = "
3.5 Tes
Kode dan konfigurasi Servera dan ServerB persis sama. Mulai Servera terlebih dahulu dan kemudian mulai serverB. Setelah server ditutup, ServerB akan memantau shutdownnya dan mengambil alih pekerjaan yang dieksekusi di Servera dan melanjutkan eksekusi.
4. CLUSTER CLUSTER CLUSTER (kuarsa tunggal)
Meskipun kami telah mengimplementasikan konfigurasi cluster dari Spring+Quartz, masih belum disarankan untuk menggunakan metode ini karena masalah kompatibilitas antara Spring dan Quartz. Di bagian ini, kami menerapkan cluster yang dikonfigurasi secara terpisah dengan kuarsa, yang sederhana dan stabil dibandingkan dengan Spring+Quartz.
4.1 Struktur Teknik
Kami menggunakan kuarsa saja untuk mengimplementasikan fungsi cluster-nya, struktur kode dan membutuhkan paket JAR pihak ketiga seperti yang ditunjukkan pada Gambar 3.1. Di antara mereka, versi MySQL: 5.1.52, dan Versi Driver MySQL: MySQL-Connector-Java-5.1.5-Bin.jar (untuk 5.1.52, disarankan untuk menggunakan versi pengemudi ini karena ada bug di kuarsa yang tidak dapat dijalankan secara normal ketika digabungkan dengan beberapa driver mySQL).
Gambar 4.1 Struktur Teknik Cluster Kuarsa dan diperlukan paket toples pihak ketiga
Di antara mereka, kuarsa.properties adalah file konfigurasi kuarsa dan ditempatkan di direktori SRC. Jika tidak ada file seperti itu, kuarsa akan secara otomatis memuat file quartz.properties dalam paket jar; Sederhanaecoveryjob.java dan SimpleCoveryStateFuljob.java adalah dua pekerjaan; Clusterexample.java menulis informasi penjadwalan, mekanisme pemicu dan fungsi utama uji yang sesuai.
4.2 File Konfigurasi Quartz.Properties
Nama file default quartz.properties digunakan untuk mengaktifkan fitur cluster dengan mengatur properti "org.quartz.jobstore.isclustered" ke "true". Setiap instance dalam cluster harus memiliki "ID instance" yang unik ("org.quartz.scheduler.instanceid" properti), tetapi harus memiliki "nama instance penjadwal" yang sama ("org.quartz.scheduler.instancename"), yang berarti bahwa setiap instance dalam cluster harus menggunakan kuartz yang sama. Kecuali untuk pengecualian berikut, isi file konfigurasi harus sama:
A. Ukuran Benang Pool.
B. Nilai atribut "org.quartz.scheduler.instanceid" yang berbeda (cukup diatur ke "otomatis").
#================================================================= =================================================================== =================================================================== =================================================================== =================================================================== =================================================================== =================================================================== =================================================================== Auto#===================================================================================================================================================================================== ======================================================================================================================== org.quartz.jobstore.impl.jdbcjobstore.jobstoretxorg.quartz.jobstore.driverdelegateClass = org.quartz.impl.jdbcjobstore.stdjdbcdelegateorg.quartz.jobstore.tdjdbcdelegateorg.quartz.jobstore.tdjdbcdelegateorg.quartz.jobstore Qrtz_org.quartz.jobstore.isclustered = trueorg.quartz.jobstore.clustercheckinInterval = 10000 org.quartz.jobstore.datasource = myds #========================================================================================================================================================== ============================================================================================================================================================= ============================================================================================================================================================= ============================================================================================================================================================= #============================================================================================================================================================== com.mysql.jdbc.driverorg.quartz.datasource.myds.url = jdbc: mysql: //192.168.31.18: 3306/tes? UseUnicode = true & characterencoding = utf-8org.quartz.dataSource.my =.my = UTF-8org.quartz.dataSource.my =.my = uTF-8org.qartz.dataSource.my = rootorg.quartz.datasource.myds.password = 123456org.quartz.datasource.myds.MaxConnections = 30#============================================================ ================================================================ ================================================================ ================================================================ ================================================================ ================================================================ ================================================================ ================================================================ org.quartz.simpl.simplethreadpoolorg.quartz.threadpool.threadcount = 5org.quartz.threadpool.threadpriority = 5org.quartz.threadpool.threadsinHeriteTexcLassLoaderoFinitializeThread = treadpool
4.3 File ClusterExample.java
paket paket; impor java.util.date; impor org.quartz.jobdetail; impor org.quartz.scheduler; impor org.quartz.schedulerFactory; impor org.quartz.simpletrigger; impor org.quartz.impl.stdschedululerfaktori Inscheduler) melempar Exception {System.out.println ("**** Menghapus pekerjaan/pemicu yang ada *****"); // string pekerjaan yang tidak dijadwalkan [] grup = inscheduler.gettriggergroupNames (); untuk (int i = 0; i <groups.length; i ++) {string [] name = inscheduler.getTriggerNames (grup [i]); untuk (int j = 0; j <names.length; j ++) {inscheduler.unscheduleJob (nama [j], grup [i]); }} // hapus grup pekerjaan = inscheduler.getjoBroupNames (); untuk (int i = 0; i <groups.length; i ++) {string [] names = inscheduler.getjoBnames (grup [i]); untuk (int j = 0; j <name.length; j ++) {inscheduler.deletejob (nama [j], grup [i]); }}} public void run (boolean incleArjobs, boolean inscheduleJobs) melempar pengecualian {// pertama -tama kita harus mendapatkan referensi ke penjadwal penjadwalFactory sf = new stdschedulerFactory (); Penjadwal sched = sf.getscheduler (); if (incleargoBs) {cleanup (scart); } System.out.println ("-------------------------------"); if (inscheduleJobs) { System.out.println ("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Ujarkan kembali pekerjaan ini jika sedang berlangsung saat // penjadwal turun ... Job.setRequestsrecovery (true); at: " + trigger.getNextFireTime() + " and repeat: " + trigger.getRepeatCount() + " times, every " + trigger.getRepeatInterval() / 1000 + " seconds"); sched.scheduleJob(job, trigger); count++; job = new JobDetail("job_" + count, schedId, SimpleRecoveryStatefulJob.class); // ask Penjadwal untuk mengeksekusi kembali pekerjaan ini jika sedang berlangsung ketika // penjadwal turun ... Job.setRequestSrecovery (false); di: " + trigger.getNextFiretime () +" dan ulangi: " + trigger.getRePeatCount () +" kali, setiap " + trigger.getRePeatInterval () / 1000 +" detik "); sched.scheduleJob (pekerjaan, pemicu);} // Job tidak mulai tembak sampai mulai () telah disebut ... System.out.println ("------------------------------------"); System.out.println("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Thread.sleep(3600L * 1000L);} Catch (Exception E) {} System.out.println ("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- args.length; }}4.4 Simplerecoveryjob.java
Cluster Paket; Impor java.io.serializable; impor java.util.date; impor org.apache.commons.logging.log; impor org.apache.commons.logging.logfactory; impor org.quartz.job; impor org.quartz.jobexecutictext org.quartz.job; impor org.quartz.jobexecutic.context; and jobs that you want to execute repeatedly, write the relevant code in the execute method, the premise is: implement the Job interface//As for when the SimpleJob class is instantiated and when the execute method is called, we don’t need to pay attention to it, and leave it to Quartzpublic class SimpleRecoveryJob implements Job, Serializable { private static Log _log = Logfactory.getLog (Simplerecoveryjob.class); publik SimplerecoveryJob () {} public void execute (JobexecutionContext Context) melempar JobExecutionException {// pekerjaan ini hanya mencetak nama pekerjaan dan waktu ketika pekerjaan menjalankan string jobname = context.getjoBdetail (). getFulLname (); System.out.println ("Pekerjaan 1111111111111111 SimplerecoveryJob mengatakan:" + jobname + "mengeksekusi di" + tanggal baru ()); }}4.5 Hasil Operasi
Konfigurasi dan kode di server A dan server B persis sama. Metode Menjalankan: Jalankan Clusterexample.java pada host apa pun, tambahkan tugas ke jadwal, dan amati hasil yang dijalankan:
Jalankan servera, hasilnya ditunjukkan pada Gambar 4.2.
Gambar 4.2 Hasil Operasi Servera 1
Setelah menyalakan ServerB, output dari Servera dan ServerB ditampilkan pada Gambar 4.3 dan 4.4.
Gambar 4.3 Hasil Running Servera 2
Gambar 4.4 Hasil Operasi ServerB 1
Dapat dilihat dari Gambar 4.3 dan 4.4 bahwa setelah ServerB dihidupkan, sistem secara otomatis menyadari tanggung jawab untuk keseimbangan, dan serverB mengambil alih pekerjaan1. Setelah mematikan Servera, hasil yang berjalan dari ServerB ditunjukkan pada Gambar 4.5.
Gambar 4.5 Hasil Operasi ServerB 2
Seperti yang dapat dilihat dari Gambar 4.5, ServerB dapat mendeteksi bahwa servera hilang, mengambil alih tugas Tugas2, dan kehilangan Servera ke Job2 yang perlu dieksekusi selama waktu pengecualian ini.
5. Hal -hal yang perlu diperhatikan
5.1 Masalah Sinkronisasi Waktu
Kuarsa tidak benar -benar peduli apakah Anda menjalankan node pada mesin yang sama atau berbeda. Ketika sebuah cluster ditempatkan pada mesin yang berbeda, itu disebut cluster horizontal. Ketika sebuah simpul berjalan pada mesin yang sama, itu disebut cluster vertikal. Untuk kelompok vertikal, ada masalah satu titik kegagalan. Ini tidak dapat diterima untuk aplikasi ketersediaan tinggi, karena begitu mesin macet, semua node diakhiri. Untuk kelompok horizontal, ada masalah sinkronisasi waktu.
Node menggunakan cap waktu untuk memberi tahu contoh lain dari waktu check-in terakhirnya sendiri. Jika jam simpul diatur ke waktu mendatang, penjadwal berjalan tidak akan lagi menyadari bahwa node telah jatuh. Di sisi lain, jika jam simpul diatur ke masa lalu, mungkin simpul lain akan menentukan bahwa simpul telah jatuh dan mencoba mengambil pekerjaan dan tayangan ulang. Cara termudah untuk menyinkronkan jam komputer adalah dengan menggunakan server waktu internet.
5.2 Masalah node yang bersaing untuk pekerjaan
Karena Kuarsa menggunakan algoritma penyeimbangan beban acak, pekerjaan dieksekusi oleh berbagai contoh secara acak. Situs web resmi Quartz menyebutkan bahwa saat ini, tidak ada metode untuk menetapkan (PIN) pekerjaan ke simpul tertentu di cluster.
5.3 Masalah untuk mendapatkan daftar pekerjaan dari cluster
Saat ini, jika Anda tidak memasukkan kueri basis data secara langsung, tidak ada cara sederhana untuk mendapatkan daftar semua pekerjaan yang dieksekusi di cluster. Meminta instance penjadwal hanya akan membuat daftar pekerjaan berjalan pada contoh itu. Situs web resmi Kuarsa merekomendasikan agar Anda dapat memperoleh semua informasi pekerjaan dari tabel yang sesuai dengan menulis beberapa kode JDBC untuk mengakses database.
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.