/** * Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved. * EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * http://www.ewcms.com */ package com.ewcms.scheduling.generate.quartz; import java.lang.reflect.Method; import java.util.Map; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.springframework.beans.BeanWrapper; import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.PropertyAccessorFactory; import org.springframework.util.ReflectionUtils; /** * * @author wuzhijun * */ public abstract class EwcmsQuartzJobBean implements Job { private static final Method getSchedulerMethod; private static final Method getMergedJobDataMapMethod; static { try { getSchedulerMethod = org.quartz.impl.JobExecutionContextImpl.class.getMethod("getScheduler", new Class[0]); getMergedJobDataMapMethod = org.quartz.impl.JobExecutionContextImpl.class.getMethod("getMergedJobDataMap", new Class[0]); } catch (NoSuchMethodException ex) { throw new IllegalStateException((new StringBuilder("Incompatible Quartz API: ")).append(ex).toString()); } } @SuppressWarnings("rawtypes") @Override public void execute(JobExecutionContext context) throws JobExecutionException { try { Scheduler scheduler = (Scheduler) ReflectionUtils.invokeMethod(getSchedulerMethod, context); Map mergedJobDataMap = (Map) ReflectionUtils.invokeMethod(getMergedJobDataMapMethod, context); BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this); MutablePropertyValues pvs = new MutablePropertyValues(); pvs.addPropertyValues(scheduler.getContext()); pvs.addPropertyValues(mergedJobDataMap); bw.setPropertyValues(pvs, true); } catch (SchedulerException ex) { throw new JobExecutionException(ex); } executeInternal(context); } protected abstract void executeInternal(JobExecutionContext jobexecutioncontext) throws JobExecutionException; }