สอนสร้าง Cron Job ด้วย Spring Boot (ต่อ)
ใน Spring Boot การดึงค่าจาก Entity เพื่อใช้เป็นค่าใน Cron Expressionสามารถทำได้โดยการปรับแต่งโค้ดให้มีความยืดหยุ่นขึ้น ซึ่งต้องใช้ Dynamic Scheduling แทนการกำหนดค่าแบบคงที่ใน @Scheduled
เนื่องจาก @Scheduled
ไม่รองรับการกำหนดค่าแบบไดนามิกโดยตรง
วิธีดึงค่าจาก Entity เพื่อใช้ใน Cron Expression
1. สร้าง Entity และ Repository
สมมติว่าเรามี Entity ที่เก็บค่า cron expression ไว้:
Entity:
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class CronConfig {
@Id
private Long id;
private String cronExpression;
// Getter and Setter
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getCronExpression() {
return cronExpression;
}
public void setCronExpression(String cronExpression) {
this.cronExpression = cronExpression;
}
}
Repository:
import org.springframework.data.jpa.repository.JpaRepository;
public interface CronConfigRepository extends JpaRepository<CronConfig, Long> {
}
2. ใช้ TaskScheduler เพื่อสร้าง Dynamic Scheduling
เราจะใช้ TaskScheduler
สำหรับการตั้งเวลาไดนามิก
Configurable Task Scheduler:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.concurrent.ScheduledFuture;
@Service
public class DynamicSchedulerService {
@Autowired
private TaskScheduler taskScheduler;
@Autowired
private CronConfigRepository cronConfigRepository;
private ScheduledFuture<?> scheduledTask;
@PostConstruct
public void scheduleTask() {
String cronExpression = fetchCronExpression();
rescheduleTask(cronExpression);
}
public void rescheduleTask(String cronExpression) {
if (scheduledTask != null) {
scheduledTask.cancel(false);
}
scheduledTask = taskScheduler.schedule(() -> {
System.out.println("Task executed at: " + System.currentTimeMillis());
}, new CronTrigger(cronExpression));
}
private String fetchCronExpression() {
// Fetch the cron expression from database (Example ID = 1)
return cronConfigRepository.findById(1L)
.map(CronConfig::getCronExpression)
.orElse("0 * * * * *"); // Default expression: run every minute
}
}
3. การอัปเดต Cron Expression ระหว่าง Runtime
สามารถอัปเดตค่า Cron Expression ได้โดยการเรียกใช้เมธอด rescheduleTask
ใน DynamicSchedulerService
:
Controller:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/scheduler")
public class SchedulerController {
@Autowired
private DynamicSchedulerService schedulerService;
@PostMapping("/update")
public String updateCronExpression(@RequestParam String cronExpression) {
schedulerService.rescheduleTask(cronExpression);
return "Scheduler updated to: " + cronExpression;
}
}
4. การตั้งค่า TaskScheduler ใน Spring Boot
Spring Boot จะใช้ ThreadPoolTaskScheduler
เป็นค่าเริ่มต้น เราสามารถกำหนดค่าเพิ่มเติมได้ใน Bean:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
@Configuration
public class SchedulerConfig {
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(5);
scheduler.setThreadNamePrefix("DynamicScheduler-");
return scheduler;
}
}
สรุป
ด้วยการใช้ TaskScheduler เราสามารถสร้างและปรับแต่ง Cron Jobs แบบไดนามิกได้ใน Spring Boot ซึ่งช่วยให้เราสามารถดึงค่าจากฐานข้อมูลหรือ Entity มาใช้ในการตั้งค่า Cron Expression ได้สะดวก นอกจากนี้ยังสามารถปรับเปลี่ยนตารางการทำงานได้ในระหว่าง Runtime โดยไม่ต้องรีสตาร์ทแอปพลิเคชัน
ความคิดเห็น
แสดงความคิดเห็น