/** * Copyright 2012 plista GmbH (http://www.plista.com/) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and limitations under the License. */ package org.plista.kornakapi.core.training; import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SimpleTrigger; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.TriggerKey; import org.quartz.impl.DirectSchedulerFactory; import org.quartz.simpl.RAMJobStore; import org.quartz.simpl.SimpleThreadPool; import org.quartz.spi.ThreadPool; import static org.quartz.TriggerBuilder.*; import java.io.Closeable; import java.io.IOException; /** a class to schedule the training of recommenders */ public class TrainingScheduler implements Closeable { private final Scheduler scheduler; public TrainingScheduler() throws Exception { ThreadPool threadPool = new SimpleThreadPool(2, Thread.NORM_PRIORITY); threadPool.initialize(); DirectSchedulerFactory schedulerFactory = DirectSchedulerFactory.getInstance(); schedulerFactory.createScheduler(threadPool, new RAMJobStore()); scheduler = schedulerFactory.getScheduler(); } public void start() { try { scheduler.start(); } catch (SchedulerException e) { throw new RuntimeException(e); } } private JobKey key(String recommenderName) { return new JobKey("train-" + recommenderName); } private TriggerKey triggerkey(String recommenderName) { return new TriggerKey("train-" + recommenderName); } public void addRecommenderTrainingJob(String recommenderName) { JobDetail job = JobBuilder.newJob(TrainRecommenderJob.class) .withIdentity(key(recommenderName)) .build(); job.getJobDataMap().put(TrainRecommenderJob.RECOMMENDER_NAME_PARAM, recommenderName); try { scheduler.addJob(job, true); } catch (SchedulerException e) { throw new RuntimeException(e); } } public void addRecommenderTrainingJobWithCronSchedule(String recommenderName, String cronExpression) { try { JobDetail job = JobBuilder.newJob(TrainRecommenderJob.class) .withIdentity(key(recommenderName)) .build(); job.getJobDataMap().put(TrainRecommenderJob.RECOMMENDER_NAME_PARAM, recommenderName); // http://www.quartz-scheduler.org/documentation/quartz-2.1.x/tutorials/crontrigger CronTrigger trigger = TriggerBuilder.newTrigger() .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)) .build(); scheduler.scheduleJob(job, trigger); } catch (SchedulerException e) { throw new RuntimeException(e); } } public void immediatelyTrainRecommender(String recommenderName) throws SchedulerException { if(!scheduler.checkExists(triggerkey(recommenderName))){ JobDetail job = scheduler.getJobDetail(key(recommenderName)); Trigger trigger = newTrigger() .withIdentity(triggerkey(recommenderName)) .forJob(job) .startNow() .build(); scheduler.scheduleJob(trigger); } } @Override public void close() throws IOException { try { scheduler.shutdown(); } catch (SchedulerException e) { throw new IOException(e); } } }