cfschedule: penjadualan tugas dalam CFML
cfschedule membolehkan anda menjadualkan tugas automatik dalam CFML di Lucee, sama ada permintaan URL atau kerja harian, tanpa bergantung pada cron sistem.

Kandungan
- cfschedule: penjadualan tugas dalam CFML
- Apa itu cfschedule
- Cara cfschedule berfungsi
- Menjadualkan tugas URL
- Menyenaraikan dan menyemak tugas
- Mengurus tugas sedia ada
- Menulis cfschedule dalam cfscript
- cfschedule berbanding cron sistem
- URL lawan komponen CFC
- Zon masa dan selang dalam saat
- cfschedule dalam bekas Docker
- Perangkap tugasan bertindih
- Soalan Lazim
- Sumber
cfschedule: penjadualan tugas dalam CFML
Setiap aplikasi web akhirnya memerlukan kerja yang berjalan tanpa sesiapa menekan butang. Laporan yang dihantar melalui e-mel setiap pagi, stok yang disegerakkan dengan pembekal setiap jam, atau sesi lama yang dibersihkan pada tengah malam, semuanya contoh tugas berjadual. Dalam CFML di Lucee, kerja ini dilakukan oleh tag cfschedule, iaitu antara muka programatik kepada enjin penjadualan yang terbina dalam enjin.
Apa itu cfschedule
cfschedule ialah tag CFML yang menjadualkan satu permintaan HTTP untuk dijalankan pada selang masa tetap. Ia menggantikan keperluan cron sistem bagi kerja yang terikat kepada aplikasi Lucee anda, dan tugasan yang didaftarkan melalui tag ini kelihatan serta boleh diurus dalam Lucee Administrator.
Tag ini menerima enam nilai untuk atribut action, iaitu update, list, pause, resume, delete, dan run. Empat nilai pertama ialah kerja harian: update mencipta atau mengemas kini tugasan, list menyenaraikan tugasan sedia ada, pause dan resume menghentikan serta menyambung tugasan, manakala delete memadamnya. Nilai run pula menjalankan tugasan serta-merta tanpa menunggu jadual.
Satu nota penting untuk Lucee 7: sistem Scheduled Task tradisional telah dipindahkan ke sambungan bernama Scheduler Classic. Pada pemasangan Lucee 7 yang bersih, jika tag cfschedule tidak tersedia, pasang sambungan itu melalui Lucee Administrator atau dengan men-deploy fail .lex. Lucee juga menyediakan sambungan Quartz Scheduler untuk mereka yang memerlukan cron expression dan clustering.
Cara cfschedule berfungsi
Setiap tugasan cfschedule disimpan dalam konfigurasi konteks web Lucee. Apabila enjin dihidupkan, penjadual memuatkan tugasan itu dan menjalankannya mengikut atribut startDate, startTime, dan interval. Tugasan itu sendiri ialah permintaan HTTP ke url yang anda tentukan, jadi apa sahaja yang boleh dicapai melalui URL boleh dijadualkan, termasuk halaman yang membaca atau menulis pangkalan data.
Satu perkara yang membezakan cfschedule daripada cron ialah butiran jadual dinyatakan sebagai tarikh, masa, dan selang, bukan sebagai lima medan cron. Ini menjadikannya lebih mudah dibaca oleh pembangun CFML, tetapi ia juga bermakna anda perlu memahami unit bagi setiap atribut, satu topik yang dibincangkan kemudian dalam artikel ini.
Menjadualkan tugas URL
Contoh paling asas ialah menjadualkan satu URL yang menjalankan kerja, misalnya halaman yang menyemak stok dan menghantar notifikasi apabila sesuatu produk hampir habis.
<cfschedule
action="update"
task="semakStok"
url="https://contoh.my/pekerjaan/semak-stok.cfm"
interval="3600"
startDate="10/17/2026"
startTime="08:00 AM"
requestTimeOut="30">
Atribut yang wajib untuk update ialah task (nama unik tugasan), url (alamat yang dijalankan), startDate (tarikh mula), startTime (masa mula), dan interval (selang dalam saat). Nilai interval 3600 bermaksud tugasan berjalan setiap jam. Sekiranya anda meninggalkan interval, nilai lalai ialah 3600, dan selang minimum yang dibenarkan ialah 10 saat.
requestTimeOut pula menetapkan had masa permintaan tugasan dalam saat, berguna untuk kerja yang mengambil masa lebih lama daripada lalai. Sekiranya url dilindungi kata laluan, atribut username dan password boleh diisi supaya penjadual dapat mencapai halaman itu.
Menyenaraikan dan menyemak tugas
Selepas mendaftarkan tugasan, gunakan action="list" untuk memastikan ia benar-benar wujud. Nilai list memulangkan satu objek query melalui atribut result.
<cfschedule action="list" result="senaraiTugas">
<cfoutput>Jumlah tugas berjadual: #senaraiTugas.recordCount#</cfoutput>
<cfloop query="senaraiTugas">
<cfoutput>#senaraiTugas.task# - setiap #senaraiTugas.interval# saat</cfoutput><br>
</cfloop>
Query itu mengandungi lajur seperti task, url, interval, startdate, starttime, dan paused. Dengan cfloop query anda boleh memaparkan setiap tugasan, atau memprosesnya secara atur cara untuk log dan pemantauan.
Mengurus tugas sedia ada
Apabila anda perlu menyelenggara tanpa memadam tugasan, gunakan pause untuk menjeda dan resume untuk menyambung semula. delete pula memadam tugasan itu sepenuhnya.
<cfschedule action="pause" task="semakStok">
<cfschedule action="resume" task="semakStok">
<cfschedule action="delete" task="semakStok">
pause mengekalkan definisi tugasan tetapi menghalangnya daripada berjalan. resume menyambungkannya semula mengikut jadual. Ketiga-tiga tindakan ini memerlukan nama tugasan yang sudah wujud, iaitu tugasan yang anda daftarkan dalam contoh update sebelum ini.
Menulis cfschedule dalam cfscript
Tag cfschedule juga disokong dalam cfscript, bentuk yang lebih kemas untuk pembangun yang memilih skrip berbanding tag. Sintaksnya hampir sama, dengan atribut ditulis sebagai parameter.
schedule action="update"
task="semakStok"
url="https://contoh.my/pekerjaan/semak-stok.cfm"
interval=3600
startDate="10/17/2026"
startTime="08:00 AM"
requestTimeOut=30;
schedule action="list" result="senaraiTugas";
writeOutput("Jumlah tugas: " & senaraiTugas.recordCount);
Pilihan antara bentuk tag dan cfscript ialah soal gaya, dan kedua-duanya menghasilkan tugasan yang sama dalam penjadual. Pembangun yang sudah selesa dengan cfscript lazimnya memilih bentuk ini kerana ia sejajar dengan kod aplikasi yang lain.
cfschedule berbanding cron sistem
Ramai pembangun bertanya sama ada lebih baik menggunakan cfschedule atau cron sistem. Jawapannya bergantung pada tempat kerja itu hidup dan siapa yang perlu mengurusnya. Jadual berikut membandingkan kedua-duanya.
| Aspek | cfschedule (Lucee) | cron sistem |
|---|---|---|
| Tempat definisi | Dalam kod CFML atau Lucee Administrator | Fail crontab pada sistem pengendalian |
| Selang minimum | 10 saat, diukur dalam saat | 1 minit, diukur dalam minit |
| Integrasi CFML | Langsung, satu tag atau satu baris cfscript | Perlu skrip pembungkus seperti curl atau fail .cfm |
| Skop | Terikat kepada konteks web Lucee | Seluruh pelayan, bebas daripada aplikasi |
| Ketahanan | Hilang jika konteks dibina semula | Kekal selagi fail crontab wujud |
| Ekspresi jadual | startDate, startTime, dan interval | Lima medan cron (minit, jam, hari, bulan, minggu) |
Garis panduan mudahnya ialah: jika kerja itu milik aplikasi dan perlu berpindah bersama aplikasi, cfschedule ialah pilihan semula jadi. Jika kerja itu tugas peringkat sistem yang mesti berjalan walaupun Lucee berhenti, cron sistem lebih sesuai.
URL lawan komponen CFC
cfschedule klasik menjadualkan permintaan HTTP sahaja, iaitu nilai lalai operation ialah HTTPRequest. Tiada atribut component atau method pada tag ini, jadi anda tidak boleh menghalakan penjadual terus kepada satu kaedah dalam komponen CFC.
Untuk menjalankan kaedah komponen mengikut jadual, anda ada dua laluan. Laluan pertama ialah menghalakan url kepada satu fail .cfm yang mencipta komponen itu lalu memanggil kaedahnya, satu corak yang dibincangkan dalam panduan fungsi dan komponen CFC. Laluan kedua ialah menggunakan sambungan Quartz Scheduler yang menyokong component-based jobs secara terus.
Zon masa dan selang dalam saat
Dua punca kekeliruan paling kerap ialah unit selang dan zon masa. Pertama, interval diukur dalam saat, bukan minit, jadi tugasan setiap 30 minit ditulis sebagai interval="1800". Silap menulis 30 akan menghasilkan tugasan yang berjalan setiap 30 saat dan membebankan pelayan.
Kedua, penjadual berjalan dalam zon masa JVM pelayan. Jika pelayan anda berada pada UTC tetapi pengguna anda di Kuala Lumpur, tugasan yang ditetapkan pada pukul 9 pagi akan berjalan pada pukul 5 petang waktu Malaysia. Tetapkan zon masa aplikasi dengan jelas dalam Application.cfc menggunakan this.timezone, dan semak nilai itu sebelum membuat kesimpulan bahawa tugasan tidak berjalan pada masa yang betul. Butiran lanjut tentang fail itu ada dalam panduan memahami Application.cfc.
cfschedule dalam bekas Docker
Tugas berjadual ialah keadaan yang disimpan dalam konteks Lucee. Dalam persekitaran Docker, konteks itu hidup dalam lapisan boleh tulis bekas. Apabila anda membina semula imej atau menggantikan bekas, konteks baharu bermula kosong dan semua tugasan cfschedule hilang. Ini bukan pepijat, ia sifat semula jadi bekas yang tidak kekal.
Penyelesaian praktikal ialah mendaftarkan semula tugasan secara atur cara dalam onApplicationStart Application.cfc, supaya tugasan dibina semula setiap kali aplikasi dihidupkan. Ini menjadikan jadual anda sebahagian daripada kod dan bukannya keadaan yang rapuh, satu topik yang berkait rapat dengan penempatan Lucee dalam Docker.
Perangkap tugasan bertindih
Jika tugasan anda mengambil masa 20 minit tetapi dijadualkan setiap 15 minit, dua salinan boleh berjalan serentak dan bertembung antara satu sama lain. Atribut unique="true" menghalang ini: ia memastikan tugasan hanya dijalankan sekali pada satu-satu masa, dan pusingan baharu tidak bermula selagi pusingan sebelumnya belum selesai.
Atribut lain yang patut diketahui ialah paused="true" untuk mendaftarkan tugasan dalam keadaan berhenti, dan autoDelete="true" yang memadam tugasan apabila tiada lagi pelaksanaan masa depan. Untuk kerja yang berjalan serentak di dalam satu permintaan, lihat pula cfthread dan konkurensi, manakala caching membantu jika tugasan anda menjana halaman statik yang perlu dihidangkan dengan pantas.
Soalan Lazim
Adakah cfschedule tersedia dalam semua versi Lucee?
Dalam Lucee 7, sistem Scheduled Task tradisional telah dipindahkan ke sambungan Scheduler Classic, jadi tag cfschedule mungkin tidak tersedia pada pemasangan bersih sehingga sambungan itu dipasang melalui Lucee Administrator atau fail .lex. Pada versi Lucee terdahulu, cfschedule tersedia secara lalai.
Apakah unit bagi atribut interval?
interval diukur dalam saat. Nilai lalai ialah 3600 saat, iaitu satu jam, dan nilai minimum yang dibenarkan ialah 10 saat. Untuk tugasan setiap 30 minit, tulis interval="1800".
Bolehkah cfschedule menjalankan kaedah dalam komponen CFC?
Tidak secara langsung. cfschedule klasik hanya menjalankan permintaan HTTP ke url yang ditentukan. Untuk menjalankan kaedah CFC, halakan url kepada fail .cfm yang memanggil komponen itu, atau gunakan sambungan Quartz Scheduler yang menyokong component-based jobs.
Mengapa tugas berjadual saya hilang selepas saya deploy semula bekas Docker?
Tugasan cfschedule disimpan dalam konteks Lucee, dan konteks itu bermula kosong setiap kali imej dibina semula atau bekas digantikan. Daftarkan semula tugasan secara atur cara dalam onApplicationStart supaya ia dibina semula setiap kali aplikasi dihidupkan.
Apakah beza cfschedule dengan cron sistem?
cfschedule berjalan di dalam Lucee dan tugasan ditakrifkan dalam kod CFML atau Lucee Administrator, manakala cron ialah penjadual sistem pengendalian yang ditakrifkan dalam fail crontab. Selang cfschedule diukur dalam saat dengan minimum 10 saat, sedangkan cron diukur dalam minit dan bebas daripada aplikasi.