Shashank Vashistha
Shashank Vashistha

Reputation: 131

Spring : Schedule a task which takes a parameter

I have a class with the following function:

public class classA{

... 
...

void function_to_be_scheduled(String param){
    ...
    ...
}
}

I want to schedule the function using the scheduled-tasks element of the task namespace.

<task:scheduled-tasks>
    <task:scheduled ref="beanA" method="function_to_be_scheduled" cron="${cron}"/>
</task:scheduled-tasks>

How do i pass the parameter to the function which i want to schedule?

Upvotes: 10

Views: 22880

Answers (5)

Ben Ketteridge
Ben Ketteridge

Reputation: 172

I've found that the only way to do this is to have a façade method that is @Scheduled and knows the default value required. The useful side-effect of this is that you can also provide an API through a @Controller to provide manual triggering with a specific parameter - useful if you need to re-run an activity.

@Scheduled(cron = "${myChronSchedule}")
public void generateActivities() {

    this.generateActivities(LocalDate.now());

}

public void generateActivities(LocalDate theDate) {
    // do the work
    ...
}

If you don't need the façade to be public, there's no reason why it can't be private and no-one is the wiser.

Upvotes: 0

Dorothy
Dorothy

Reputation: 11

The Task Scheduler did the trick for me

  1. First create a configuration class called ThreadPoolTaskScheduler class. Find details Here!

  2. Then create a class where the magic happens

    @Component
    public class ThreadPoolTaskSchedulerExample {
    
    @Autowired
    private ThreadPoolTaskScheduler taskScheduler;
    
    
         class EmailWatch implements Runnable{
    
             private String userEmail;
    
    
             public EmailWatch(String userEmail){
                 this.userEmail = userEmail;
             }
    
    
             @Override
             public void run() {
                  System.out.println("This is the email "+ userEmail);
             }
         }
    
    
         public void watchEmail(String userEmail)  {
    
       //refresh watch every minute
             CronTrigger cronTrigger = new CronTrigger("0 * * ? * *"); 
             taskScheduler.schedule(new EmailWatch(userEmail));
         }
     }
    

Upvotes: -1

Leos Literak
Leos Literak

Reputation: 9406

You can use TaskScheduler and encapsule your logic with a parameter in Runnable:

@Autowired
private TaskScheduler scheduler;

public void scheduleRules() {
    MyTask task = new MyTaskImpl(someParam);
    // new CronTrigger
    scheduler.scheduleAtFixedRate(task, Duration.ofMinutes(1));
}

Upvotes: 2

Giovanni
Giovanni

Reputation: 4015

The Spring doc about scheduling says:

Notice that the methods to be scheduled must have void returns and must not expect any arguments

Since the parameter comes from the Spring config file you can declare a bean (es beanB which wraps beanA) in the spring file, inject the parameter you need in the bean and the schedule the execution of a method of the bean which knows the parameter (it could be a simple wrapper of your beanA)

Upvotes: 4

Robert Niestroj
Robert Niestroj

Reputation: 16151

According to the docs you cant.

Notice that the methods to be scheduled must have void returns and must not expect any arguments.

Upvotes: 12

Related Questions