首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java EE 定時執行 Servlet:用 ScheduledExecutorService 或 Quartz,別在 Servlet 里睡覺

     編輯:程式設計綜合問答

想每 10 分鐘更新寵物體力值,直接在 Servlet 裡 Thread.sleep 是大忌。正規軍用容器管理的排程器,或成熟框架 Quartz/Spring Task。

方案一:ServletContextListener + ScheduledExecutorService(零依賴)

@WebListener
public class PetScheduler implements ServletContextListener {
    private ScheduledExecutorService scheduler;
    
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        scheduler = Executors.newSingleThreadScheduledExecutor(r -> {
            Thread t = new Thread(r, "PetPowerUpdater");
            t.setDaemon(true);
            return t;
        });
        scheduler.scheduleAtFixedRate(() -> {
            try {
                // 呼叫業務邏輯更新體力
                PetService.updatePower();
            } catch (Exception e) {
                log.error("更新體力失敗", e);
            }
        }, 0, 10, TimeUnit.MINUTES);
    }
    
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        scheduler.shutdownNow();
    }
}

方案二:Spring @Scheduled(Spring 專案首選)

@Configuration
@EnableScheduling
public class ScheduleConfig {}

@Component
public class PetTask {
    @Autowired PetService petService;
    
    @Scheduled(fixedRate = 600_000) // 10分鐘
    public void updatePower() {
        petService.updatePower();
    }
}

方案三:Quartz(集群、持久化、Cron 表達式)

需引入 quartz、quartz-jobs,配置 quartz.properties 使用 JDBC JobStore,支援多節點分佈式排程,適合高可用需求。

核心原則

  • 排程線程必須由容器/框架管理生命週期,隨應用啟動/銷毀。
  • 業務邏輯剝離為 Service/DAO,排程器只負責觸發,便於單元測試。
  • 異常捕獲 + 重試 + 監控告警,避免靜默失敗。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved