79349055

Date: 2025-01-11 23:05:28
Score: 1
Natty:
Report link

ScheduledTaskRegistrar can be used in that way (Spring Boot version 3.4.1):

import org.springframework.context.annotation.Configuration;
import org.springframework.lang.NonNull;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.support.CronTrigger;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

@Configuration
@EnableScheduling
public class SchedulingConfig implements org.springframework.scheduling.annotation.SchedulingConfigurer {

    private final CustomCronTrigger customCronTrigger = new CustomCronTrigger("0/10 * * * * ?"); // Runs every 10 seconds.

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskScheduler());
        taskRegistrar.addTriggerTask(
                new Runnable() {
                    @Override
                    public void run() {
                        LocalDateTime scheduledTime = customCronTrigger.getScheduledTime();
                        System.out.println("Method was scheduled at: " + scheduledTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                    }
                },
                customCronTrigger
        );
    }

    public Executor taskScheduler() {
        return Executors.newScheduledThreadPool(1); // Use the executor of your liking.
    }

    class CustomCronTrigger implements Trigger {
        private LocalDateTime scheduledTime;
        private final CronTrigger cronTrigger;

        public CustomCronTrigger(String cronExpression) {
            this.cronTrigger = new CronTrigger(cronExpression);
        }

        public LocalDateTime getScheduledTime() {
            return scheduledTime;
        }

        @Override
        public Instant nextExecution(@NonNull TriggerContext triggerContext) {
            Instant nextExecutionInstant = cronTrigger.nextExecution(triggerContext);
            if (nextExecutionInstant != null) {
                scheduledTime = nextExecutionInstant.atZone(java.time.ZoneId.systemDefault()).toLocalDateTime();
            }
            return nextExecutionInstant;
        }

    }
}

Output:

2025-01-12T00:56:04.804+0200 INFO Initializing ProtocolHandler ["http-nio-8080"]
2025-01-12T00:56:04.805+0200 INFO Starting service [Tomcat]
2025-01-12T00:56:04.805+0200 INFO Starting Servlet engine: [Apache Tomcat/10.1.34]
2025-01-12T00:56:04.825+0200 INFO Initializing Spring embedded WebApplicationContext
2025-01-12T00:56:04.827+0200 INFO Root WebApplicationContext: initialization completed in 398 ms
2025-01-12T00:56:05.033+0200 INFO Starting ProtocolHandler ["http-nio-8080"]
2025-01-12T00:56:05.043+0200 INFO Tomcat started on port 8080 (http) with context path '/'
2025-01-12T00:56:05.050+0200 INFO Started CrudCoreApplication in 0.847 seconds (process running for 1.127)
Method was scheduled at: 2025-01-12 00:56:10
Method was scheduled at: 2025-01-12 00:56:20
Method was scheduled at: 2025-01-12 00:56:30

Please move CustomCronTrigger in a separate class file, and if possible for Runnable as well, to have better organization of code. The class and runnable are provided as such for demonstration purposes of the answer.

Out of curiosity, why do you need to be that exact though?

Reasons:
  • Long answer (-1):
  • Has code block (-0.5):
  • Ends in question mark (2):
  • Low reputation (0.5):
Posted by: mariosmant