想每 10 分鐘更新寵物體力值,直接在 Servlet 裡 Thread.sleep 是大忌。正規軍用容器管理的排程器,或成熟框架 Quartz/Spring Task。
@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();
}
}
@Configuration
@EnableScheduling
public class ScheduleConfig {}
@Component
public class PetTask {
@Autowired PetService petService;
@Scheduled(fixedRate = 600_000) // 10分鐘
public void updatePower() {
petService.updatePower();
}
}
需引入 quartz、quartz-jobs,配置 quartz.properties 使用 JDBC JobStore,支援多節點分佈式排程,適合高可用需求。