在play framework 1.x中,可以使用@on注解來讓定時器在某個時間段自動執行,如:
@On("0 0 12 * * ?")public class MyJob extends Job{public void doJob() { //業務邏輯 }}如果我們需要在@On之前做業務邏輯操作,可以:
1、JobScheduler.java
import java.util.Date;import java.util.concurrent.Callable;import java.util.concurrent.TimeUnit;import models.Partner;import play.Logger;import play.jobs.Job;import play.jobs.JobsPlugin;import play.libs.ExPRession;import play.libs.Time.CronExpression;public class JobScheduler { public static synchronized void scheduleCsvExportJob(String cron) { MyJob myJob = null; for (Job<?> job : JobsPlugin.scheduledJobs) { if (job instanceof MyJob) { myJob = (MyJob) job; } } if (myJob == null) { myJob = new MyJob(); JobsPlugin.scheduledJobs.add(myJob); } myJob.cron = cron; scheduleForCRON(myJob, myJob.cron); } public static void scheduleForCRON(MyJob job, String cron) { try { Date now = new Date(); cron = Expression.evaluate(cron, cron).toString(); CronExpression cronExp = new CronExpression(cron); Date nextDate = cronExp.getNextValidTimeAfter(now); if (nextDate != null && !nextDate.equals(job.nextPlannedExecution)) { job.nextPlannedExecution = nextDate; JobsPlugin.executor.schedule((Callable<?>) job, nextDate.getTime() - now.getTime(), TimeUnit.MILLISECONDS); job.setExecutor(JobsPlugin.executor); } } catch (Exception ex) { Logger.error(ex, "Cannot schedule job %s", job); } }}2、然后編寫自己的定時器進行調用: MyJob.java:
package jobs;import java.util.Date;import java.util.concurrent.ExecutorService;import play.jobs.Job;public class MyJob extends Job<Object> { public Date nextPlannedExecution = null; public String cron = null; @Override public void _finally() { if (cron != null) { // 如果cron不為null再執行 super._finally(); // 執行自定義的定時器時間進行任務調度 JobScheduler.scheduleForCRON(this, cron); } } void setExecutor(ExecutorService executor) { this.executor = executor; }}注:play framework 1.x中的@On(“0 0 12 * * ?”)注解使用的是cron表達式。
新聞熱點
疑難解答