/*
* RHQ Management Platform
* Copyright (C) 2005-2014 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.enterprise.server.scheduler;
import java.lang.management.ManagementFactory;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import javax.ejb.Stateless;
import javax.management.MBeanServerInvocationHandler;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Calendar;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobListener;
import org.quartz.SchedulerContext;
import org.quartz.SchedulerException;
import org.quartz.SchedulerListener;
import org.quartz.SchedulerMetaData;
import org.quartz.Trigger;
import org.quartz.TriggerListener;
import org.quartz.UnableToInterruptJobException;
import org.quartz.spi.JobFactory;
/**
* The Scheduler session bean is a proxy to the Quartz scheduler MBean that is used for scheduling jobs to be executed
* within the JON Server. Use this to provide transactional access to Quartz.
*/
@Stateless
public class SchedulerBean implements SchedulerLocal {
@SuppressWarnings("unused")
private static final long serialVersionUID = 1L;
private final Log log = LogFactory.getLog(SchedulerBean.class.getName());
/**
* Returns a reference to a proxy to the scheduler service MBean, which itself is a proxy that delegates to the
* Quartz scheduler.
*
* @return proxy to the scheduler service MBean
*
* @throws SchedulerException if failed to find the MBean
*/
private SchedulerServiceMBean getSchedulerService() throws SchedulerException {
try {
return MBeanServerInvocationHandler.newProxyInstance(
ManagementFactory.getPlatformMBeanServer(), SCHEDULER_MBEAN_NAME, SchedulerServiceMBean.class, false);
} catch (Exception e) {
throw new SchedulerException("Failed to get a proxy to the scheduler service MBean", e);
}
}
/**
* @see SchedulerLocal#scheduleRepeatingJob(String, String, JobDataMap, Class, boolean, boolean, long, long)
*/
public void scheduleRepeatingJob(String name, String groupName, JobDataMap jobData, Class<? extends Job> jobClass,
boolean rescheduleIfExists, boolean isVolatile, long initialDelay, long interval) throws SchedulerException {
new EnhancedSchedulerImpl(getSchedulerService()).scheduleRepeatingJob(name, groupName, jobData, jobClass,
rescheduleIfExists, isVolatile, initialDelay, interval);
return;
}
/**
* @see SchedulerLocal#scheduleCronJob(String, String, JobDataMap, Class, boolean, boolean, String)
*/
public void scheduleCronJob(String name, String groupName, JobDataMap jobData, Class<? extends Job> jobClass,
boolean rescheduleIfExists, boolean isVolatile, String cronString) throws SchedulerException {
new EnhancedSchedulerImpl(getSchedulerService()).scheduleCronJob(name, groupName, jobData, jobClass,
rescheduleIfExists, isVolatile, cronString);
return;
}
/**
* @see SchedulerLocal#scheduleSimpleRepeatingJob(Class, boolean, boolean, long, long)
*/
public void scheduleSimpleRepeatingJob(Class<? extends Job> jobClass, boolean rescheduleIfExists,
boolean isVolatile, long initialDelay, long interval) throws SchedulerException {
new EnhancedSchedulerImpl(getSchedulerService()).scheduleSimpleRepeatingJob(jobClass, rescheduleIfExists,
isVolatile, initialDelay, interval);
return;
}
/**
* @see SchedulerLocal#scheduleSimpleCronJob(Class, boolean, boolean, String)
*/
public void scheduleSimpleCronJob(Class<? extends Job> jobClass, boolean rescheduleIfExists, boolean isVolatile,
String cronString, Integer misfireInstruction) throws SchedulerException {
new EnhancedSchedulerImpl(getSchedulerService()).scheduleSimpleCronJob(jobClass, rescheduleIfExists,
isVolatile, cronString, misfireInstruction);
return;
}
public Properties getQuartzProperties() {
try {
return getSchedulerService().getQuartzProperties();
} catch (SchedulerException e) {
log.error("Failed to get the Quartz properties", e);
return null;
}
}
/**
* Delegates to the Scheduler Service MBean in order to set the properties for Quartz and reinitialize the Quartz
* scheduler factory.
*
* @see SchedulerServiceMBean#setQuartzProperties(Properties)
*/
public void setQuartzProperties(final Properties quartzProps) throws SchedulerException {
getSchedulerService().setQuartzProperties(quartzProps);
}
public Integer getDefaultOperationTimeout() {
try {
return getSchedulerService().getDefaultOperationTimeout();
} catch (SchedulerException e) {
log.error("Failed to get the default operation timeout", e);
return null;
}
}
public void initQuartzScheduler() throws SchedulerException {
getSchedulerService().initQuartzScheduler();
}
public void startQuartzScheduler() throws SchedulerException {
getSchedulerService().startQuartzScheduler();
}
//---------------------------------------------------------------------
//-- Scheduler interface methods
//---------------------------------------------------------------------
public String getSchedulerName() throws SchedulerException {
return getSchedulerService().getSchedulerName();
}
public String getSchedulerInstanceId() throws SchedulerException {
return getSchedulerService().getSchedulerInstanceId();
}
public SchedulerContext getContext() throws SchedulerException {
return getSchedulerService().getContext();
}
public SchedulerMetaData getMetaData() throws SchedulerException {
return getSchedulerService().getMetaData();
}
public void start() throws SchedulerException {
getSchedulerService().start();
}
public void pause() throws SchedulerException {
getSchedulerService().pause();
}
public boolean isPaused() throws SchedulerException {
return getSchedulerService().isPaused();
}
public void shutdown() throws SchedulerException {
getSchedulerService().shutdown();
}
public void shutdown(boolean waitForJobsToComplete) throws SchedulerException {
getSchedulerService().shutdown(waitForJobsToComplete);
}
public boolean isShutdown() throws SchedulerException {
return getSchedulerService().isShutdown();
}
public List getCurrentlyExecutingJobs() throws SchedulerException {
return getSchedulerService().getCurrentlyExecutingJobs();
}
public Date scheduleJob(JobDetail jobDetail, Trigger trigger) throws SchedulerException {
if (log.isDebugEnabled()) {
log.debug("Job details: " + jobDetail);
}
return getSchedulerService().scheduleJob(jobDetail, trigger);
}
public Date scheduleJob(Trigger trigger) throws SchedulerException {
return getSchedulerService().scheduleJob(trigger);
}
public void addJob(JobDetail jobDetail, boolean replace) throws SchedulerException {
getSchedulerService().addJob(jobDetail, replace);
}
public boolean deleteJob(String jobName, String groupName) throws SchedulerException {
return getSchedulerService().deleteJob(jobName, groupName);
}
public boolean unscheduleJob(String triggerName, String groupName) throws SchedulerException {
return getSchedulerService().unscheduleJob(triggerName, groupName);
}
public void triggerJob(String jobName, String groupName) throws SchedulerException {
getSchedulerService().triggerJob(jobName, groupName);
}
public void triggerJobWithVolatileTrigger(String jobName, String groupName) throws SchedulerException {
getSchedulerService().triggerJobWithVolatileTrigger(jobName, groupName);
}
public void pauseTrigger(String triggerName, String groupName) throws SchedulerException {
getSchedulerService().pauseTrigger(triggerName, groupName);
}
public void pauseTriggerGroup(String groupName) throws SchedulerException {
getSchedulerService().pauseTriggerGroup(groupName);
}
public void pauseJob(String jobName, String groupName) throws SchedulerException {
getSchedulerService().pauseJob(jobName, groupName);
}
public void pauseJobGroup(String groupName) throws SchedulerException {
getSchedulerService().pauseJobGroup(groupName);
}
public void resumeTrigger(String triggerName, String groupName) throws SchedulerException {
getSchedulerService().resumeTrigger(triggerName, groupName);
}
public void resumeTriggerGroup(String groupName) throws SchedulerException {
getSchedulerService().resumeTriggerGroup(groupName);
}
public void resumeJob(String jobName, String groupName) throws SchedulerException {
getSchedulerService().resumeJob(jobName, groupName);
}
public void resumeJobGroup(String groupName) throws SchedulerException {
getSchedulerService().resumeJobGroup(groupName);
}
public String[] getJobGroupNames() throws SchedulerException {
return getSchedulerService().getJobGroupNames();
}
public String[] getJobNames(String groupName) throws SchedulerException {
return getSchedulerService().getJobNames(groupName);
}
public Trigger[] getTriggersOfJob(String jobName, String groupName) throws SchedulerException {
return getSchedulerService().getTriggersOfJob(jobName, groupName);
}
public String[] getTriggerGroupNames() throws SchedulerException {
return getSchedulerService().getTriggerGroupNames();
}
public String[] getTriggerNames(String groupName) throws SchedulerException {
return getSchedulerService().getTriggerNames(groupName);
}
public JobDetail getJobDetail(String jobName, String jobGroup) throws SchedulerException {
return getSchedulerService().getJobDetail(jobName, jobGroup);
}
public Trigger getTrigger(String triggerName, String triggerGroup) throws SchedulerException {
return getSchedulerService().getTrigger(triggerName, triggerGroup);
}
public boolean deleteCalendar(String calName) throws SchedulerException {
return getSchedulerService().deleteCalendar(calName);
}
public Calendar getCalendar(String calName) throws SchedulerException {
return getSchedulerService().getCalendar(calName);
}
public String[] getCalendarNames() throws SchedulerException {
return getSchedulerService().getCalendarNames();
}
public void addGlobalJobListener(JobListener jobListener) throws SchedulerException {
getSchedulerService().addGlobalJobListener(jobListener);
}
public void addJobListener(JobListener jobListener) throws SchedulerException {
getSchedulerService().addJobListener(jobListener);
}
public boolean removeGlobalJobListener(JobListener jobListener) throws SchedulerException {
return getSchedulerService().removeGlobalJobListener(jobListener);
}
public boolean removeJobListener(String name) throws SchedulerException {
return getSchedulerService().removeJobListener(name);
}
public List getGlobalJobListeners() throws SchedulerException {
return getSchedulerService().getGlobalJobListeners();
}
public Set getJobListenerNames() throws SchedulerException {
return getSchedulerService().getJobListenerNames();
}
public JobListener getJobListener(String name) throws SchedulerException {
return getSchedulerService().getJobListener(name);
}
public void addGlobalTriggerListener(TriggerListener triggerListener) throws SchedulerException {
getSchedulerService().addGlobalTriggerListener(triggerListener);
}
public void addTriggerListener(TriggerListener triggerListener) throws SchedulerException {
getSchedulerService().addTriggerListener(triggerListener);
}
public boolean removeGlobalTriggerListener(TriggerListener triggerListener) throws SchedulerException {
return getSchedulerService().removeGlobalTriggerListener(triggerListener);
}
public boolean removeTriggerListener(String name) throws SchedulerException {
return getSchedulerService().removeTriggerListener(name);
}
public List getGlobalTriggerListeners() throws SchedulerException {
return getSchedulerService().getGlobalTriggerListeners();
}
public Set getTriggerListenerNames() throws SchedulerException {
return getSchedulerService().getTriggerListenerNames();
}
public TriggerListener getTriggerListener(String name) throws SchedulerException {
return getSchedulerService().getTriggerListener(name);
}
public void addSchedulerListener(SchedulerListener schedulerListener) throws SchedulerException {
getSchedulerService().addSchedulerListener(schedulerListener);
}
public boolean removeSchedulerListener(SchedulerListener schedulerListener) throws SchedulerException {
return getSchedulerService().removeSchedulerListener(schedulerListener);
}
public List getSchedulerListeners() throws SchedulerException {
return getSchedulerService().getSchedulerListeners();
}
// Quartz methods that are new in 1.5.1 that were not in 1.0.7
public void addCalendar(String calName, Calendar calendar, boolean replace, boolean updateTriggers)
throws SchedulerException {
getSchedulerService().addCalendar(calName, calendar, replace, updateTriggers);
}
public Set getPausedTriggerGroups() throws SchedulerException {
return getSchedulerService().getPausedTriggerGroups();
}
public int getTriggerState(String triggerName, String triggerGroup) throws SchedulerException {
return getSchedulerService().getTriggerState(triggerName, triggerGroup);
}
public boolean interrupt(String jobName, String groupName) throws UnableToInterruptJobException {
try {
return getSchedulerService().interrupt(jobName, groupName);
} catch (SchedulerException e) {
throw new UnableToInterruptJobException(e);
}
}
public boolean isInStandbyMode() throws SchedulerException {
return getSchedulerService().isInStandbyMode();
}
public void pauseAll() throws SchedulerException {
getSchedulerService().pauseAll();
}
public Date rescheduleJob(String triggerName, String groupName, Trigger newTrigger) throws SchedulerException {
return getSchedulerService().rescheduleJob(triggerName, groupName, newTrigger);
}
public void resumeAll() throws SchedulerException {
getSchedulerService().resumeAll();
}
public void setJobFactory(JobFactory factory) throws SchedulerException {
getSchedulerService().setJobFactory(factory);
}
public void standby() throws SchedulerException {
getSchedulerService().standby();
}
public void triggerJob(String jobName, String groupName, JobDataMap data) throws SchedulerException {
getSchedulerService().triggerJob(jobName, groupName, data);
}
public void triggerJobWithVolatileTrigger(String jobName, String groupName, JobDataMap data)
throws SchedulerException {
getSchedulerService().triggerJob(jobName, groupName, data);
}
/* new methods in quartz 1.6.5 below this line */
public JobListener getGlobalJobListener(String jobName) throws SchedulerException {
return getSchedulerService().getGlobalJobListener(jobName);
}
public TriggerListener getGlobalTriggerListener(String triggerName) throws SchedulerException {
return getSchedulerService().getGlobalTriggerListener(triggerName);
}
public boolean isStarted() throws SchedulerException {
return getSchedulerService().isStarted();
}
public boolean removeGlobalJobListener(String jobName) throws SchedulerException {
return getSchedulerService().removeGlobalJobListener(jobName);
}
public boolean removeGlobalTriggerListener(String triggerName) throws SchedulerException {
return getSchedulerService().removeGlobalTriggerListener(triggerName);
}
public void startDelayed(int delay) throws SchedulerException {
getSchedulerService().startDelayed(delay);
}
@Override
public void scheduleTriggeredJob(Class<? extends Job> jobClass, boolean isVolatile, Trigger trigger)
throws SchedulerException {
new EnhancedSchedulerImpl(getSchedulerService()).scheduleTriggeredJob(jobClass, isVolatile, trigger);
return;
}
}