Karakter Khusus Quartz: L, W, dan # Dijelaskan
Panduan mendalam tingkat token untuk operator L, W, dan # di Quartz agar Anda dapat membangun jadwal presisi tanpa kejutan runtime.
Buka Quartz GeneratorMengapa Karakter Khusus Quartz Penting
Sebagian besar kesalahan cron dimulai sebelum deployment, ketika tujuan jadwal dan sintaks berbeda. Cron standar lima-field mencakup menit, jam, hari-dalam-bulan, bulan, dan hari-dalam-minggu. Quartz memperluas ini dengan field detik, field tahun, dan tiga karakter khusus—L, W, dan #—yang membuka presisi penjadwalan yang tidak dapat ditandingi oleh cron standar.
Karakter-karakter ini berperilaku berbeda tergantung pada field mana mereka muncul, dan kesalahpahaman kecil berjenjang menjadi jadwal yang berjalan di hari yang salah atau melewatkan eksekusi sepenuhnya. Artikel ini menjelaskan setiap karakter dengan contoh praktis, pemeriksaan validasi, dan tindakan jelas selanjutnya yang dapat Anda lakukan di Quartz Generator Cronwise.
Karakter L: Hari Terakhir dan Hari Kerja Terakhir
L singkatan dari "last" (terakhir) dan valid di dua field: hari-dalam-bulan dan hari-dalam-minggu. Artinya berubah tergantung di mana Anda menempatkannya.
L di Hari-dalam-Bulan
Ketika digunakan sendiri, L berarti hari terakhir dalam bulan. Ekspresi 0 0 18 L * ? berjalan pukul 6:00 sore pada hari terakhir setiap bulan—apakah itu tanggal 28, 29, 30, atau 31. Anda tidak perlu menghardcode panjang bulan.
Anda dapat menggabungkan L dengan offset negatif. L-3 berarti tiga hari sebelum hari terakhir. Dalam bulan 31 hari itu menjadi tanggal 28; di Februari tahun non-kabisat menjadi tanggal 25. Ini berguna untuk jendela cut-off penagihan.
L di Hari-dalam-Minggu
Di field hari-dalam-minggu, Anda memasangkan L dengan nomor hari kerja: 6L berarti Jumat terakhir dalam bulan. Ekspresi 0 0 9 ? * 6L berjalan pukul 9:00 pagi pada Jumat terakhir setiap bulan—berguna untuk pemrosesan gaji atau laporan akhir bulan yang harus jatuh pada hari kerja tertentu.
Karakter W: Hari Kerja Terdekat
W hanya valid di field hari-dalam-bulan. Ini memilih hari kerja terdekat (Senin sampai Jumat) dari tanggal yang ditentukan. Tulis 15W untuk berarti "hari kerja terdekat dengan tanggal 15."
Bagaimana W Menyelesaikan
Jika tanggal 15 jatuh pada hari Sabtu, jadwal bergeser ke Jumat tanggal 14. Jika jatuh pada hari Minggu, bergeser ke Senin tanggal 16. Resolusi tidak pernah melewati batas bulan: jika tanggal 1 adalah hari Sabtu, 1W menjadi Senin tanggal 3, bukan Jumat sebelumnya.
Menggabungkan L dan W
Quartz mengizinkan kombinasi LW, yang berarti "hari kerja terakhir dalam bulan." Ini ideal untuk penutupan keuangan akhir bulan yang harus berjalan di hari kerja. Jika hari terakhir adalah Sabtu, LW menjadi Jumat. Perhatikan bahwa W tidak dapat digabungkan dengan daftar atau rentang—ekspresi seperti 1W,15W tidak valid.
Karakter #: Hari Kerja Ke-N dalam Bulan
# hanya valid di field hari-dalam-minggu dan menentukan kemunculan ke-N dari hari kerja dalam sebulan. Sintaksnya adalah hari#N, di mana hari adalah nomor hari kerja (1–7, Minggu sampai Sabtu) dan N adalah kemunculan (1–5).
Contoh Praktis
0 0 10 ? * 2#1 berjalan pukul 10:00 pagi pada Senin pertama setiap bulan. 0 0 14 ? * 6#3 berjalan pukul 2:00 sore pada Jumat ketiga. Pola-pola ini menggantikan workaround rapuh yang mengandalkan rentang hari-dalam-bulan dan logika kondisional.
Ketika N Melebihi Kemunculan Aktual
Jika Anda menentukan 2#5 (Senin kelima), jadwal tidak berjalan di bulan yang hanya memiliki empat Senin. Quartz memperlakukan ini sebagai tidak cocok, bukan error—pelewatan diam-diam yang membuat pemantauan jumlah eksekusi menjadi penting.
Karakter # tidak dapat muncul di hari-dalam-bulan dan tidak dapat digabungkan dengan daftar, rentang, atau increment. Setiap field hari-dalam-minggu menerima paling banyak satu spesifikasi #.
Perilaku Khusus dan Mode Kegagalan
Kesalahan halus dengan karakter-karakter ini jarang memicu error validasi tetapi secara diam-diam menyimpang dari tujuan.
Jebakan Umum
| Ekspresi | Diharapkan | Aktual | Perbaikan |
|---|---|---|---|
0 0 9 L * 6 | Hari terakhir jika Jumat | Konflik: kedua field hari diisi | Gunakan ? di satu field hari |
0 0 9 1W * ? (tanggal 1 adalah Sabtu) | Jumat sebelumnya | Senin tanggal 3 (tidak lintas bulan) | Verifikasi dengan pratinjau waktu eksekusi berikutnya |
0 0 9 ? * 2#5 | Senin kelima setiap bulan | Hanya bulan dengan lima Senin | Tambahkan pemantauan jumlah eksekusi |
0 0 9 LW * ? di Februari | Hari kerja terakhir | Tanggal 26, 27, atau 28 tergantung tahun | Periksa pratinjau yang sadar zona waktu |
Error paling berbahaya adalah menentukan nilai di kedua field hari-dalam-bulan dan hari-dalam-minggu tanpa menggunakan ? sebagai placeholder. Quartz mengharuskan tepat satu field hari berisi ?. Menghilangkannya menghasilkan error parse atau perilaku tidak terdefinisi tergantung versi Quartz.
Kerangka Keputusan: Memilih Karakter yang Tepat
Setiap karakter khusus menyelesaikan masalah penjadwalan yang berbeda. Memilih yang tepat tergantung pada apakah jadwal Anda berlabuh pada tanggal kalender, hari kerja, atau posisi relatif dalam bulan.
| Kebutuhan | Karakter | Field | Contoh |
|---|---|---|---|
| Jalankan di hari terakhir setiap bulan | L | Hari-dalam-bulan | 0 0 18 L * ? |
| Jalankan N hari sebelum akhir bulan | L-N | Hari-dalam-bulan | 0 0 18 L-3 * ? |
| Jalankan di hari kerja terakhir yang spesifik | nL | Hari-dalam-minggu | 0 0 9 ? * 6L |
| Jalankan di hari kerja terdekat dari tanggal | W | Hari-dalam-bulan | 0 0 9 15W * ? |
| Jalankan di hari kerja terakhir dalam bulan | LW | Hari-dalam-bulan | 0 0 17 LW * ? |
| Jalankan di hari kerja ke-N dalam bulan | # | Hari-dalam-minggu | 0 0 10 ? * 2#1 |
Ketika kebutuhan Anda murni berbasis tanggal ("tanggal 15"), Anda tidak memerlukan karakter khusus sama sekali. Gunakan W hanya ketika kesesuaian hari kerja diperlukan. Gunakan # hanya ketika kemunculan hari kerja berulang lebih penting dari tanggal tetap. Dan gunakan L ketika semantik akhir bulan harus beradaptasi dengan panjang bulan yang bervariasi secara otomatis.
Penguatan Produksi: Pemeriksaan Pra-Deploy
Sebelum jadwal Quartz apa pun mencapai produksi, jalankan langkah verifikasi ini untuk menangkap kasus khusus yang tidak dapat dimunculkan validasi statis.
Checklist Verifikasi
| Pemeriksaan | Mengapa Penting | Kriteria Lulus |
|---|---|---|
| Parse tanpa error | Mengonfirmasi validitas sintaksis | Tidak ada exception parser |
| Inspeksi 10 eksekusi berikutnya | Memunculkan kejutan batas bulan | Semua tanggal sesuai tujuan |
| Verifikasi kesesuaian zona waktu | Ketidakcocokan TZ server vs bisnis | Eksekusi sesuai zona waktu target |
Konfirmasi penempatan ? | Kedua field hari aktif tidak terdefinisi | Satu field hari memiliki ? |
| Periksa pelewatan diam-diam | #5 mungkin berjalan < 12 kali/tahun | Jumlah tahunan didokumentasikan |
Pratinjau waktu eksekusi berikutnya Cronwise mengembalikan 10 eksekusi mendatang di zona waktu pilihan Anda, memungkinkan Anda memverifikasi kriteria ini tanpa men-deploy pekerjaan uji. Jika tim Anda beroperasi lintas zona waktu, tinjau Zona Waktu Cron Dijelaskan untuk Tim Global untuk panduan tambahan.
Menyatukan Semuanya
Karakter L, W, dan # Quartz memberi Anda kekuatan penjadwalan yang tidak dapat ditandingi cron standar. L beradaptasi dengan panjang bulan yang bervariasi, W menyelaraskan eksekusi ke hari kerja, dan # menyematkan eksekusi ke kemunculan hari kerja tertentu. Digunakan dengan benar, mereka menghilangkan workaround rapuh dan membuat tujuan jadwal eksplisit dalam ekspresi itu sendiri.
Aturan keputusan kuncinya sederhana. Gunakan L untuk logika akhir bulan. Gunakan W ketika Anda membutuhkan hari kerja terdekat. Gunakan # untuk hari kerja ke-N dalam sebulan. Selalu tempatkan ? di field hari yang tidak Anda gunakan. Dan selalu verifikasi dengan pratinjau waktu eksekusi berikutnya sebelum deployment.
Siap membangun atau memvalidasi jadwal Quartz Anda? Buka Cronwise Quartz Generator untuk membangun ekspresi secara visual, melihat penjelasan dalam bahasa sederhana, dan melihat pratinjau waktu eksekusi di zona waktu target Anda. Untuk lebih banyak panduan penjadwalan cron dan pembahasan mendalam, jelajahi semua artikel cron di Cronwise.