/**
* Copyright 1996-2014 FoxBPM ORG.
*
* 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.
*
* @author MAENLIANG
*/
package org.foxbpm.engine.impl.util;
import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
import java.util.Date;
import java.util.Properties;
import org.foxbpm.engine.ProcessEngineManagement;
import org.foxbpm.engine.exception.FoxBPMException;
import org.foxbpm.engine.impl.schedule.FoxbpmJobDetail;
import org.foxbpm.engine.impl.schedule.FoxbpmScheduler;
import org.foxbpm.kernel.runtime.ListenerExecutionContext;
import org.quartz.CronTrigger;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
*
* QuartzUtil QUARTZ框架的工具辅助类
*
* MAENLIANG 2014年6月30日 下午4:41:20
*
* @version 1.0.0
*
*/
public final class QuartzUtil {
private static Logger LOG = LoggerFactory.getLogger(QuartzUtil.class);
/**
* 创建简单触发器
*
* @param groupName
* 组名
* @param DataTime
* 启动时间
* @return
*/
public final static Trigger createSimpleTrigger(String groupName, Date DataTime) {
Trigger trigger = newTrigger().withIdentity(GuidUtil.CreateGuid(), groupName).startAt(DataTime).build();
return trigger;
}
/**
* 创建简单触发器
*
* @param DataTime
* 启动时间
* @return
*/
public final static Trigger createSimpleTrigger(ListenerExecutionContext executionContext,
Date DataTime) {
Trigger trigger = newTrigger().withIdentity(GuidUtil.CreateGuid(), executionContext.getProcessInstanceId()).startAt(DataTime).build();
return trigger;
}
/**
* 创建复杂触发器
*
* @param groupName
* 组名
* @param cronExpression
* cron表达式
* @return
*/
public final static Trigger createCronTrigger(String groupName, String cronExpression) {
CronTrigger trigger = newTrigger().withIdentity(GuidUtil.CreateGuid(), groupName).withSchedule(cronSchedule(cronExpression)).build();
return trigger;
}
/**
* 创建复杂触发器
*
* @param jobName
* 作业名
* @param groupName
* 组名
* @param cronExpression
* cron表达式
* @return
*/
public final static Trigger createCronTrigger(ListenerExecutionContext executionContext,
String cronExpression) {
CronTrigger trigger = newTrigger().withIdentity(GuidUtil.CreateGuid(), executionContext.getProcessInstanceId()).withSchedule(cronSchedule(cronExpression)).build();
return trigger;
}
/**
* 创建复杂触发器
*
* @param jobName
* 作业名
* @param groupName
* 组名
* @param cronExpression
* cron表达式
* @param startTime
* 开始时间
* @param endTime
* 结束时间
* @return
*/
public final static Trigger createCronTrigger(ListenerExecutionContext executionContext,
String cronExpression, Date startTime, Date endTime) {
TriggerBuilder<CronTrigger> triggerBuilder = newTrigger().withIdentity(GuidUtil.CreateGuid(), executionContext.getProcessInstanceId()).withSchedule(cronSchedule(cronExpression));
if (startTime != null) {
triggerBuilder.startAt(startTime);
}
if (endTime != null) {
triggerBuilder.endAt(endTime);
}
CronTrigger trigger = triggerBuilder.build();
return trigger;
}
/**
*
* 根据日期对应的字符串创建
*
* @param dateTime
* @param groupName
* @return Trigger
* @exception
* @since 1.0.0
*/
public final static Trigger createTriggerByDateTimeStr(Object dateTime, String groupName) {
Date startDateTime = ClockUtil.parseStringToDate((String) dateTime);
return newTrigger().withIdentity(GuidUtil.CreateGuid(), groupName).startAt(startDateTime).build();
}
/**
*
* 根据日期类型创建TRIGGER
*
* @param dateTimeObj
* @param groupName
* @return Trigger
* @exception
* @since 1.0.0
*/
public final static Trigger createTriggerByDateTime(Object dateTimeObj, String groupName) {
Date dateTime = (Date) dateTimeObj;
return newTrigger().withIdentity(GuidUtil.CreateGuid(), groupName).startAt(dateTime).build();
}
/**
*
* 根据组名称删除组下面的所有JOB
*
* @param groupName
* void
* @exception
* @since 1.0.0
*/
public final static void deleteJob(String groupName) {
try {
FoxbpmScheduler foxbpmScheduler = ProcessEngineManagement.getDefaultProcessEngine().getProcessEngineConfiguration().getFoxbpmScheduler();
if (foxbpmScheduler == null) {
LOG.debug("调度器未启动,无法清空调度任务");
return;
}
foxbpmScheduler.deleteJobsByGroupName(groupName);
} catch (Exception e) {
throw new FoxBPMException("QuartzUtil删除Job报错", e);
}
}
/**
* 调度,先清空后调度
*
* @param jobKey
* @param jobDetail
*/
public final static void scheduleFoxbpmJob(FoxbpmJobDetail<?> jobDetail) {
try {
FoxbpmScheduler foxbpmScheduler = ProcessEngineManagement.getDefaultProcessEngine().getProcessEngineConfiguration().getFoxbpmScheduler();
if (foxbpmScheduler == null) {
LOG.debug("调度器未启动,无法调度任务!");
return;
}
// 先清空,后调度
foxbpmScheduler.deleteJob(jobDetail);
foxbpmScheduler.scheduleFoxbpmJob(jobDetail);
} catch (Exception e) {
throw new FoxBPMException("调度 《流程自动启动JOB》时候出现问题!");
}
}
/**
* 创建定时任务工厂
*
* @return
*/
public final static SchedulerFactory createSchedulerFactory() {
SchedulerFactory sf = new StdSchedulerFactory();
return sf;
}
/**
* 根据传入的属性文件创建定时任务工厂
*
* @param props
* @return
*/
public final static SchedulerFactory createSchedulerFactory(Properties props) {
SchedulerFactory sf = null;
try {
sf = new StdSchedulerFactory(props);
} catch (Exception e) {
throw new FoxBPMException("QuartzUtil 创建 SchedulerFactory出问题", e);
}
return sf;
}
/**
* 根据任务工厂拿到定时任务
*
* @param schedulerFactory
* 任务工厂
* @return
*/
public final static Scheduler getScheduler(SchedulerFactory schedulerFactory) {
Scheduler scheduler = null;
try {
scheduler = schedulerFactory.getScheduler();
} catch (Exception e) {
throw new FoxBPMException("QuartzUtil 创建 Scheduler出问题", e);
}
return scheduler;
}
}