?? cmsschedulemanager.java
字號:
/*
* File : $Source: /usr/local/cvs/opencms/src/org/opencms/scheduler/CmsScheduleManager.java,v $
* Date : $Date: 2006/03/27 14:52:20 $
* Version: $Revision: 1.27 $
*
* This library is part of OpenCms -
* the Open Source Content Mananagement System
*
* Copyright (c) 2005 Alkacon Software GmbH (http://www.alkacon.com)
*
* 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.
*
* For further information about Alkacon Software GmbH, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* 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
*/
package org.opencms.scheduler;
import org.opencms.file.CmsObject;
import org.opencms.i18n.CmsMessageContainer;
import org.opencms.main.CmsLog;
import org.opencms.main.OpenCms;
import org.opencms.security.CmsRole;
import org.opencms.security.CmsRoleViolationException;
import org.opencms.util.CmsStringUtil;
import org.opencms.util.CmsUUID;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
/**
* Manages the OpenCms scheduled jobs.<p>
*
* Please see the documentation of the class {@link org.opencms.scheduler.CmsScheduledJobInfo}
* for a full description of the OpenCms scheduling capabilities.<p>
*
* The OpenCms scheduler implementation internally uses the
* <a href="http://www.opensymphony.com/quartz/">Quartz scheduler</a> from
* the <a href="http://www.opensymphony.com/">OpenSymphony project</a>.<p>
*
* This manager class implements the <code>org.quartz.Job</code> interface
* and wraps all calls to the {@link org.opencms.scheduler.I_CmsScheduledJob} implementing
* classes.<p>
*
* @author Alexander Kandzior
*
* @version $Revision: 1.27 $
*
* @since 6.0.0
*
* @see org.opencms.scheduler.CmsScheduledJobInfo
*/
public class CmsScheduleManager implements Job {
/** Key for the scheduled job description in the job data map. */
public static final String SCHEDULER_JOB_INFO = "org.opencms.scheduler.CmsScheduledJobInfo";
/** The log object for this class. */
private static final Log LOG = CmsLog.getLog(CmsScheduleManager.class);
/** The Admin context used for creation of users for the individual jobs. */
private static CmsObject m_adminCms;
/** The list of job entries from the configuration. */
private List m_configuredJobs;
/** The list of scheduled jobs. */
private List m_jobs;
/** The initialized scheduler. */
private Scheduler m_scheduler;
/**
* Default constructor for the scheduler manager,
* used only when a new job is scheduled.<p>
*/
public CmsScheduleManager() {
// important: this constructor is always called when a new job is
// generated, so it _must_ remain empty
}
/**
* Used by the configuration to create a new Scheduler during system startup.<p>
*
* @param configuredJobs the jobs from the configuration
*/
public CmsScheduleManager(List configuredJobs) {
m_configuredJobs = configuredJobs;
int size = 0;
if (m_configuredJobs != null) {
size = m_configuredJobs.size();
}
if (CmsLog.INIT.isInfoEnabled()) {
CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_SCHEDULER_CREATED_1, new Integer(size)));
}
}
/**
* Implementation of the Quartz job interface.<p>
*
* The architecture is that this scheduler manager generates
* a new (empty) instance of itself for every OpenCms job scheduled with Quartz.
* When the Quartz job is executed, the configured
* implementaion of {@link I_CmsScheduledJob} will be called from this method.<p>
*
* @see org.quartz.Job#execute(org.quartz.JobExecutionContext)
*/
public void execute(JobExecutionContext context) {
JobDataMap jobData = context.getJobDetail().getJobDataMap();
CmsScheduledJobInfo jobInfo = (CmsScheduledJobInfo)jobData.get(SCHEDULER_JOB_INFO);
if (jobInfo == null) {
LOG.error(Messages.get().getBundle().key(Messages.LOG_INVALID_JOB_1, context.getJobDetail().getFullName()));
// can not continue
return;
}
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_JOB_STARTING_1, jobInfo.getJobName()));
}
I_CmsScheduledJob job = jobInfo.getJobInstance();
if (job != null) {
try {
// launch the job
CmsObject cms = null;
// only simple test cases might not have admin cms available
if (m_adminCms != null) {
// generate a CmsObject for the job context
cms = OpenCms.initCmsObject(m_adminCms, jobInfo.getContextInfo());
}
String result = job.launch(cms, jobInfo.getParameters());
if (CmsStringUtil.isNotEmpty(result) && LOG.isInfoEnabled()) {
LOG.info(Messages.get().getBundle().key(
Messages.LOG_JOB_EXECUTION_OK_2,
jobInfo.getJobName(),
result));
}
} catch (Throwable t) {
LOG.error(Messages.get().getBundle().key(Messages.LOG_JOB_EXECUTION_ERROR_1, jobInfo.getJobName()), t);
}
}
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_JOB_EXECUTED_1, jobInfo.getJobName()));
Date nextExecution = jobInfo.getExecutionTimeNext();
if (nextExecution != null) {
LOG.info(Messages.get().getBundle().key(
Messages.LOG_JOB_NEXT_EXECUTION_2,
jobInfo.getJobName(),
nextExecution));
}
}
}
/**
* Returns the currently scheduled job description identified by the given id.
*
* @param id the job id
*
* @return a job or <code>null</code> if not found
*/
public CmsScheduledJobInfo getJob(String id) {
Iterator it = m_jobs.iterator();
while (it.hasNext()) {
CmsScheduledJobInfo job = (CmsScheduledJobInfo)it.next();
if (job.getId().equals(id)) {
return job;
}
}
// not found
return null;
}
/**
* Returns the currently scheduled job descriptions in an unmodifiable list.<p>
*
* The objects in the List are of type <code>{@link CmsScheduledJobInfo}</code>.<p>
*
* @return the currently scheduled job descriptions in an unmodifiable list
*/
public List getJobs() {
return Collections.unmodifiableList(m_jobs);
}
/**
* Initializes the OpenCms scheduler.<p>
*
* @param cms an OpenCms context object that must have been initialized with "Admin" permissions
*
* @throws CmsRoleViolationException if the user has insufficient role permissions
*/
public synchronized void initialize(CmsObject cms) throws CmsRoleViolationException {
if (OpenCms.getRunLevel() > OpenCms.RUNLEVEL_1_CORE_OBJECT) {
// simple unit tests will have runlevel 1 and no CmsObject
cms.checkRole(CmsRole.SCHEDULER_MANAGER);
}
// the list of job entries
m_jobs = new ArrayList();
// save the admin cms
m_adminCms = cms;
// Quartz scheduler settings
Properties properties = new Properties();
properties.put(StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME, "OpenCmsScheduler");
properties.put(StdSchedulerFactory.PROP_SCHED_THREAD_NAME, "OpenCms: Scheduler");
properties.put(StdSchedulerFactory.PROP_SCHED_RMI_EXPORT, CmsStringUtil.FALSE);
properties.put(StdSchedulerFactory.PROP_SCHED_RMI_PROXY, CmsStringUtil.FALSE);
properties.put(StdSchedulerFactory.PROP_THREAD_POOL_CLASS, CmsSchedulerThreadPool.class.getName());
properties.put(StdSchedulerFactory.PROP_JOB_STORE_CLASS, "org.quartz.simpl.RAMJobStore");
try {
// initilize the Quartz scheduler
SchedulerFactory schedulerFactory = new StdSchedulerFactory(properties);
m_scheduler = schedulerFactory.getScheduler();
} catch (Exception e) {
LOG.error(Messages.get().getBundle().key(Messages.LOG_NO_SCHEDULER_0), e);
// can not continue
m_scheduler = null;
return;
}
if (CmsLog.INIT.isInfoEnabled()) {
CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_SCHEDULER_INITIALIZED_0));
}
if (m_configuredJobs != null) {
// add all jobs from the system configuration
for (int i = 0; i < m_configuredJobs.size(); i++) {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -