У меня есть приложение весенней загрузки с двумя планировщиками классов Java (с именами 'A' и 'B').«A» выполняет две работы в разное время. «B» выполняет одну работу каждые 9 секунд.Здесь я дам вам два файла классов. Вы можете вставить их в любое приложение весенней загрузки.Когда мы запускаем приложение, выполняются задания «A» и «B».
A.java
import java.util.ArrayList;
import java.util.Date;
import java.util.concurrent.ScheduledFuture;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import com.sample.entity.IiSchedulerCofiguration;
import com.sample.service.CroneService;
import com.sample.util.SchedulerName;
@Configuration
@EnableScheduling
public class A implements SchedulingConfigurer {
@Autowired
private CroneService croneService;
TaskScheduler taskScheduler;
private ScheduledFuture<?> job1;
private ScheduledFuture<?> job2;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(10);// Set the pool of threads
threadPoolTaskScheduler.initialize();
// final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
ArrayList<IiSchedulerCofiguration> jobList = croneService.getJobDetails(SchedulerName.SCHEDULER_NAME_OF_A);
for (IiSchedulerCofiguration eachJob : jobList) {
String jobName = eachJob.getJobName();
if (jobName.equalsIgnoreCase("job1")) {
threadPoolTaskScheduler.setThreadNamePrefix("Thread " + SchedulerName.SCHEDULER_NAME_OF_A + " ");
job1(threadPoolTaskScheduler, eachJob.getJobTime());// Assign the job1 to the scheduler
}
if (jobName.equalsIgnoreCase("job2")) {
job2(threadPoolTaskScheduler, eachJob.getJobTime());// Assign the job1 to the scheduler
}
}
this.taskScheduler = threadPoolTaskScheduler;// this will be used in later part of the article during refreshing
taskRegistrar.setTaskScheduler(threadPoolTaskScheduler);// the cron expression dynamically
}
private void job1(TaskScheduler scheduler, String executionTime) {
job1 = scheduler.schedule(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " - JOB 1 OF A IS EXECUTED AT " + new Date());
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
return new CronTrigger(executionTime).nextExecutionTime(triggerContext);
}
});
}
private void job2(TaskScheduler scheduler, String executionTime) {
job2 = scheduler.schedule(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " - JOB 2 OF A IS EXECUTED AT " + new Date());
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
return new CronTrigger(executionTime).nextExecutionTime(triggerContext);
}
});
}
}
B.java
import java.util.Date;
import java.util.concurrent.ScheduledFuture;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
@Configuration
@EnableScheduling
public class B implements SchedulingConfigurer {
TaskScheduler taskScheduler;
private ScheduledFuture<?> job1;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ThreadPoolTaskScheduler threadPoolTaskScheduler =new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(10);// Set the pool of threads
threadPoolTaskScheduler.setThreadNamePrefix("scheduler-thread");
threadPoolTaskScheduler.initialize();
job1(threadPoolTaskScheduler);// Assign the job1 to the scheduler
this.taskScheduler=threadPoolTaskScheduler;// this will be used in later part of the article during refreshing the cron expression dynamically
taskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
}
private void job1(TaskScheduler scheduler) {
job1 = scheduler.schedule(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "Scheduler B is executed at " + new Date());
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
String cronExp = "0/9 * * * * ?";// Can be pulled from a db .
return new CronTrigger(cronExp).nextExecutionTime(triggerContext);
}
});
}
}
Мое требование - создать абстрактный класс, чтобы избежать повторения кода планирования для этого общего класса.Этот абстрактный класс должен быть общим планировщиком для 'A' и 'B'. Как я могу создать абстрактный класс?Как я могу создать общий динамический класс для планировщика. Пожалуйста, помогите.