首页 > 学院 > 开发设计 > 正文

在play framework 1.x中,自定义cron执行实现

2019-11-06 06:40:23
字体:
来源:转载
供稿:网友

在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表达式。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表