package org.red5.server.scheduling;
/*
* RED5 Open Source Flash Server - http://www.osflash.org/red5
*
* Copyright (c) 2006-2009 by respective authors (see below). All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 2.1 of the License, or (at your option) any later
* version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with this library; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import org.red5.server.api.scheduling.IScheduledJob;
import org.red5.server.api.scheduling.ISchedulingService;
import org.red5.server.jmx.JMXAgent;
/**
* Scheduling service that uses Quartz as backend.
*
* @author The Red5 Project (red5@osflash.org)
* @author Joachim Bauch (jojo@struktur.de)
* @author Paul Gregoire (mondain@gmail.com)
*/
public class QuartzSchedulingService implements ISchedulingService,
QuartzSchedulingServiceMBean {
/**
* Creates schedulers
*/
private static SchedulerFactory schedFact = new StdSchedulerFactory();
/**
* Number of job details
*/
private AtomicLong jobDetailCounter = new AtomicLong(0);
/**
* Service scheduler
*/
private Scheduler scheduler;
/** Constructs a new QuartzSchedulingService. */
public QuartzSchedulingService() {
try {
scheduler = schedFact.getScheduler();
scheduler.start();
//register with jmx server
JMXAgent.registerMBean(this, this.getClass().getName(),
QuartzSchedulingServiceMBean.class);
} catch (SchedulerException ex) {
throw new RuntimeException(ex);
}
}
/** {@inheritDoc} */
public String addScheduledJob(int interval, IScheduledJob job) {
String result = getJobName();
// Create trigger that fires indefinitely every <interval> milliseconds
SimpleTrigger trigger = new SimpleTrigger("Trigger_" + result, null,
new Date(), null, SimpleTrigger.REPEAT_INDEFINITELY, interval);
scheduleJob(result, trigger, job);
return result;
}
/** {@inheritDoc} */
public String addScheduledOnceJob(Date date, IScheduledJob job) {
String result = getJobName();
// Create trigger that fires once at <date>
SimpleTrigger trigger = new SimpleTrigger("Trigger_" + result, null,
date);
scheduleJob(result, trigger, job);
return result;
}
/** {@inheritDoc} */
public String addScheduledOnceJob(long timeDelta, IScheduledJob job) {
// Create trigger that fires once in <timeDelta> milliseconds
return addScheduledOnceJob(new Date(System.currentTimeMillis()
+ timeDelta), job);
}
/** {@inheritDoc} */
public String addScheduledJobAfterDelay(int interval, IScheduledJob job, int delay) {
String result = getJobName();
// Initialize the start time to now and add the delay.
long startTime = System.currentTimeMillis() + delay;
// Create trigger that fires indefinitely every <internval> milliseconds.
SimpleTrigger trigger = new SimpleTrigger("Trigger_" + result,
null, new Date(startTime), null, SimpleTrigger.REPEAT_INDEFINITELY, interval);
// Schedule the job with Quartz.
scheduleJob(result, trigger, job);
// Return the job name.
return result;
}
/**
* Getter for job name.
*
* @return Job name
*/
public String getJobName() {
String result = "ScheduledJob_" + jobDetailCounter.getAndIncrement();
return result;
}
/** {@inheritDoc} */
public List<String> getScheduledJobNames() {
List<String> result = new ArrayList<String>();
try {
for (String name : scheduler.getJobNames(null)) {
result.add(name);
}
} catch (SchedulerException ex) {
throw new RuntimeException(ex);
}
return result;
}
/** {@inheritDoc} */
public void pauseScheduledJob(String name) {
try {
scheduler.pauseTrigger("Trigger_" + name, null);
} catch (SchedulerException ex) {
throw new RuntimeException(ex);
}
}
/** {@inheritDoc} */
public void resumeScheduledJob(String name) {
try {
scheduler.resumeTrigger("Trigger_" + name, null);
} catch (SchedulerException ex) {
throw new RuntimeException(ex);
}
}
/** {@inheritDoc} */
public void removeScheduledJob(String name) {
try {
scheduler.deleteJob(name, null);
} catch (SchedulerException ex) {
throw new RuntimeException(ex);
}
}
/**
* Schedules job
* @param name Job name
* @param trigger Job trigger
* @param job Scheduled job object
*
* @see org.red5.server.api.scheduling.IScheduledJob
*/
private void scheduleJob(String name, Trigger trigger, IScheduledJob job) {
// Store reference to applications job and service
JobDetail jobDetail = new JobDetail(name, null,
QuartzSchedulingServiceJob.class);
jobDetail.getJobDataMap().put(
QuartzSchedulingServiceJob.SCHEDULING_SERVICE, this);
jobDetail.getJobDataMap().put(QuartzSchedulingServiceJob.SCHEDULED_JOB,
job);
try {
scheduler.scheduleJob(jobDetail, trigger);
} catch (SchedulerException ex) {
throw new RuntimeException(ex);
}
}
public void shutdown() throws SchedulerException {
scheduler.shutdown();
}
}