สอนสร้าง 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 โดยไม่ต้องรีสตาร์ทแอปพลิเคชัน

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การใช้งาน RPC (Remote Procedure Call) ด้วย Java พร้อมตัวอย่างเกมออนไลน์ (ต่อ)

เริ่มต้นสร้าง Quiz Widgets แบบสอบถามบนเว็บกัน

การใช้งาน RPC (Remote Procedure Call) ด้วย Java พร้อมตัวอย่างเกมออนไลน์อย่างง่าย