亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Spring ScheduledTaskRegistrar 進行異步調度

使用 Spring ScheduledTaskRegistrar 進行異步調度

暮色呼如 2023-06-08 20:59:28
我有問題,我想在運行時創建一個計劃任務。計劃任務應以固定速率觸發。但現在我遇到了手動設置計劃未以異步方式觸發的問題。主要問題是,我們沒有任何可以啟動調度程序的修復點。它應該在我讀取特定值 (1) 時創建,并在值變回 (0) 時被銷毀。否則我們可以使用下面測試 1 中描述的注釋配置。到目前為止我嘗試了什么:1. 安排@Scheduled(fixedRate = 500L)和@Async代碼@Async@Scheduled(fixedRate = 500L)public void annotationTest() {    UUID id = UUID.randomUUID();    log.warn("Hello from Thread {} going to sleep", id);    try {        Thread.sleep(1000L);    } catch (InterruptedException e) {        e.printStackTrace();    }    log.warn("Finished Thread {}", id);}在類級別也有@EnableAsync和注釋。@EnableScheduling結果09:56:24.855 [task-5] : Hello from Thread 3b5514b2-3b80-4641-bf12-2cd320c4b6e5 going to sleep09:56:25.355 [task-6] : Hello from Thread e98514a7-e193-422b-9569-f7635deb33f8 going to sleep09:56:25.356 [task-4] : Finished Thread d86f5f24-bffb-4ddd-93fe-2334ed48cf9109:56:25.854 [task-7] : Hello from Thread cfc2ab03-4e7e-4a4a-aa08-41d696cb6df7 going to sleep09:56:25.855 [task-5] : Finished Thread 3b5514b2-3b80-4641-bf12-2cd320c4b6e509:56:26.355 [task-6] : Finished Thread e98514a7-e193-422b-9569-f7635deb33f8評論這按預期工作,但我們無法使用它,因為我們必須在運行時創建調度程序并在特定時間/輸入后銷毀它。2. 設置一個ScheduledTaskRegistrar代碼//@Configuration@Beanpublic ScheduledTaskRegistrar scheduledTaskRegistrar() {    ScheduledTaskRegistrar scheduledTaskRegistrar = new ScheduledTaskRegistrar();    scheduledTaskRegistrar.setScheduler(threadPoolTaskScheduler());    return scheduledTaskRegistrar;}@Beanpublic TaskScheduler threadPoolTaskScheduler() {    ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();    scheduler.setPoolSize(20);    return scheduler;}//@Componentpublic void printMessages() {    scheduledTaskRegistrar.scheduleFixedRateTask(new FixedRateTask(new OwnRunnable(), 500L, 0L));}還將OwnRunnable休眠 1 秒,然后打印完成文本正如我們所見,任務以同步方式運行,不符合我們的要求。
查看完整描述

1 回答

?
繁華開滿天機

TA貢獻1816條經驗 獲得超4個贊

對的,這是可能的。假設您實現 SchedulingConfigurer 的類有一個方法 doMyJob()。您可以使用 Async 注釋該方法并使用 FixedRateTask 中的引用。還要注意類級別注釋


@Configuration

@EnableAsync

public class MyJobConfig implements SchedulingConfigurer {


    @Override

    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {

        taskRegistrar.scheduleFixedRateTask(new FixedRateTask(this::doMyJob, 500L, 0L));

    }


    @Async

    public void doMyJob() {

        try {

            Thread.sleep(1000L);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }

}

希望能幫助到你


編輯


我提供了未經測試的代碼。最近當我試圖重新創建這個場景時,我注意到如果doMyJob在SchedulingConfigurer中,它不會是真正的異步(如果延遲是 5 秒并且作業需要 10 秒,下一個作業僅在 10 秒后運行)。但是將方法移至服務類會有所幫助。


查看完整回答
反對 回復 2023-06-08
  • 1 回答
  • 0 關注
  • 321 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號