Rumah >Java >javaTutorial >Bagaimanakah Saya Boleh Menjadualkan Kerja Secara Dinamik pada Musim Bunga Tanpa Menetapkan Semula?

Bagaimanakah Saya Boleh Menjadualkan Kerja Secara Dinamik pada Musim Bunga Tanpa Menetapkan Semula?

Barbara Streisand
Barbara Streisandasal
2024-11-29 10:59:10212semak imbas

How Can I Dynamically Schedule Jobs in Spring Without Redeploying?

Menjadualkan Kerja Secara Dinamik pada Musim Bunga

Latar Belakang:

Perpustakaan Penjadualan Musim Bunga memudahkan proses penjadualan tugas pada selang masa yang tetap menggunakan anotasi (@Dijadualkan). Walau bagaimanapun, kadangkala ia menjadi perlu untuk melaraskan masa yang dijadualkan secara dinamik tanpa menggunakan semula aplikasi. Ini boleh dicapai menggunakan mekanisme Pencetus.

Menggunakan Pencetus:

Pencetus membolehkan anda mengira masa pelaksanaan seterusnya bagi tugas yang dijadualkan dengan cepat. Pendekatan ini memintas had penggunaan anotasi untuk penjadualan dinamik. Begini cara anda boleh melaksanakannya:

Contoh:

Dalam contoh ini, Pencetus tersuai dicipta untuk menentukan masa pelaksanaan seterusnya secara dinamik berdasarkan nilai harta yang diperoleh daripada persekitaran.

@Configuration
@EnableScheduling
public class MyAppConfig implements SchedulingConfigurer {

    @Autowired
    Environment env;

    @Bean
    public MyBean myBean() {
        return new MyBean();
    }

    @Bean(destroyMethod = "shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(100);
    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
        taskRegistrar.addTriggerTask(
                new Runnable() {
                    @Override public void run() {
                        myBean().getSchedule();
                    }
                },
                new Trigger() {
                    @Override public Date nextExecutionTime(TriggerContext triggerContext) {
                        Calendar nextExecutionTime = new GregorianCalendar();
                        Date lastActualExecutionTime = triggerContext.lastActualExecutionTime();
                        nextExecutionTime.setTime(lastActualExecutionTime != null ? lastActualExecutionTime : new Date());
                        nextExecutionTime.add(Calendar.MILLISECOND, env.getProperty("myRate", Integer.class)); // Obtain value programmatically
                        return nextExecutionTime.getTime();
                    }
                }
        );
    }
}

Dalam konfigurasi ini:

  • Persekitaran bean digunakan untuk mendapatkan semula sifat myRate yang dinamik.
  • Pencetus ditakrifkan untuk mengira masa pelaksanaan seterusnya berdasarkan nilai harta yang diperoleh semula.
  • SpeduledTaskRegistrar digunakan untuk mendaftarkan tugasan yang dijadualkan dengan Pencetus dinamik.

Dengan menggunakan Pencetus, anda boleh melaraskan secara dinamik masa yang dijadualkan berdasarkan mana-mana logik atau nilai yang tersedia pada masa jalan, memberikan fleksibiliti dan kawalan ke atas penjadualan tugas.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menjadualkan Kerja Secara Dinamik pada Musim Bunga Tanpa Menetapkan Semula?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn