ข้ามไปที่เนื้อหาหลัก

เรื่องที่แนะนำ

คู่มือ Java ฉบับทันสมัย (อัปเดตล่าสุดปี 2025)

 คู่มือ Java ฉบับทันสมัย (อัปเดตล่าสุดปี 2025) บทนำ Java ยังคงเป็นภาษายอดนิยมที่ได้รับความนิยมอย่างต่อเนื่องตั้งแต่ยุค 1990 จนถึงปัจจุบัน ในปี 2025 Java ได้ก้าวหน้าอย่างมากทั้งด้านภาษาหลักและเครื่องมือสนับสนุน ล่าสุด Java 24 ได้เปิดตัวออกมาแล้ว และ Java 21 เป็นเวอร์ชัน LTS (Long-Term Support) ที่แนะนำให้ใช้งานสำหรับระบบจริงในระยะยาว บทความนี้จะช่วยให้คุณเข้าใจภาพรวมของ Java เวอร์ชันล่าสุด รวมถึงฟีเจอร์เด่น โครงสร้างภาษาที่ควรรู้ และแนวทางการพัฒนา Java ยุคใหม่ ภาพรวมเวอร์ชัน Java ล่าสุด เวอร์ชัน สถานะ วันเปิดตัว Java 24 เวอร์ชันล่าสุด มีนาคม 2025 Java 21 เวอร์ชัน LTS ล่าสุด กันยายน 2023 Java 17 LTS รุ่นก่อนหน้า กันยายน 2021 Java 11 LTS เก่า กันยายน 2018 โครงสร้างพื้นฐานของภาษา Java คลาสและอ็อบเจกต์ : โครงสร้างหลักของโปรแกรม Java Primitive Types : int, double, char, boolean เป็นต้น Control Statements : if, switch, while, for, do-while Methods : การแยกโค้ดเป็นหน่วยที่นำกลับมาใช้ซ้ำได้ Array และ Collection : จัดเก็บและจัดการข้อมูลหลายรายการ Exception Handling : try-catch-finally OOP Co...

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

ความคิดเห็น

บทความที่ได้รับความนิยม