propertysettingjobfactory.java
来自「Quartz 是个开源的作业调度框架」· Java 代码 · 共 305 行
JAVA
305 行
/* * Copyright 2004-2005 OpenSymphony * * 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. * */package org.quartz.simpl;import java.beans.BeanInfo;import java.beans.IntrospectionException;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.InvocationTargetException;import java.util.Locale;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.quartz.Job;import org.quartz.JobDataMap;import org.quartz.SchedulerException;import org.quartz.spi.TriggerFiredBundle;/** * A JobFactory that instantiates the Job instance (using the default no-arg * constructor, or more specifically: <code>class.newInstance()</code>), and * then attempts to set all values in the <code>JobExecutionContext</code>'s * <code>JobDataMap</code> onto bean properties of the <code>Job</code>. * * @see org.quartz.spi.JobFactory * @see SimpleJobFactory * @see JobExecutionContext#getMergedJobDataMap() * @see #setWarnIfPropertyNotFound(boolean) * @see #setThrowIfPropertyNotFound(boolean) * * @author jhouse */public class PropertySettingJobFactory extends SimpleJobFactory { private Log log = LogFactory.getLog(SimpleJobFactory.class); private boolean warnIfNotFound = true; private boolean throwIfNotFound = false; public Job newJob(TriggerFiredBundle bundle) throws SchedulerException { Job job = super.newJob(bundle); JobDataMap jobDataMap = new JobDataMap(); jobDataMap.putAll(bundle.getJobDetail().getJobDataMap()); jobDataMap.putAll(bundle.getTrigger().getJobDataMap()); setBeanProps(job, jobDataMap); return job; } protected void setBeanProps(Object obj, JobDataMap data) throws SchedulerException { BeanInfo bi = null; try { bi = Introspector.getBeanInfo(obj.getClass()); } catch (IntrospectionException e1) { if(isThrowIfPropertyNotFound()) { throw new SchedulerException("Unable to introspect Job class.", e1); } if(isWarnIfPropertyNotFound()) { log.warn("Unable to introspect Job class.", e1); } } PropertyDescriptor[] propDescs = bi.getPropertyDescriptors(); java.util.Iterator keys = data.keySet().iterator(); while (keys.hasNext()) { String name = (String) keys.next(); String c = name.substring(0, 1).toUpperCase(Locale.US); String methName = "set" + c + name.substring(1); java.lang.reflect.Method setMeth = getSetMethod(methName, propDescs); Class paramType = null; Object o = null; try { if (setMeth == null) { if(isThrowIfPropertyNotFound()) { throw new SchedulerException( "No setter on Job class " + obj.getClass() + " for property '" + name + "'"); } if(isWarnIfPropertyNotFound()) { log.warn( "No setter on Job class " + obj.getClass() + " for property '" + name + "'"); } continue; } paramType = setMeth.getParameterTypes()[0]; o = data.get(name); if (paramType.equals(int.class)) { if(o instanceof Integer) setMeth.invoke(obj, new Object[]{o}); else if(o instanceof String) setMeth.invoke(obj, new Object[]{data.getIntegerFromString(name)}); } else if (paramType.equals(long.class)) { if(o instanceof Long) setMeth.invoke(obj, new Object[]{o}); else if(o instanceof String) setMeth.invoke(obj, new Object[]{data.getLongFromString(name)}); } else if (paramType.equals(float.class)) { if(o instanceof Float) setMeth.invoke(obj, new Object[]{o}); else if(o instanceof String) setMeth.invoke(obj, new Object[]{data.getFloatFromString(name)}); } else if (paramType.equals(double.class)) { if(o instanceof Double) setMeth.invoke(obj, new Object[]{o}); else if(o instanceof String) setMeth.invoke(obj, new Object[]{data.getDoubleFromString(name)}); } else if (paramType.equals(boolean.class)) { if(o instanceof Boolean) setMeth.invoke(obj, new Object[]{o}); else if(o instanceof String) setMeth.invoke(obj, new Object[]{data.getBooleanFromString(name)}); } else if (paramType.equals(String.class)) { if(o instanceof String) setMeth.invoke(obj, new Object[]{o}); } else { if(paramType.isAssignableFrom(o.getClass())) { setMeth.invoke(obj, new Object[]{o}); } else throw new NoSuchMethodException(); } } catch (NumberFormatException nfe) { if(isThrowIfPropertyNotFound()) { throw new SchedulerException( "The setter on Job class " + obj.getClass() + " for property '" + name + "' expects a " + paramType + " but was given " + o, nfe); } if(isWarnIfPropertyNotFound()) { log.warn( "The setter on Job class " + obj.getClass() + " for property '" + name + "' expects a " + paramType + " but was given " + o, nfe); } continue; } catch (NoSuchMethodException e) { if(isThrowIfPropertyNotFound()) { throw new SchedulerException( "The setter on Job class " + obj.getClass() + " for property '" + name + "' expects a " + paramType + " but was given " + o.getClass()); } if(isWarnIfPropertyNotFound()) { log.warn( "The setter on Job class " + obj.getClass() + " for property '" + name + "' expects a " + paramType + " but was given a " + o.getClass()); } continue; } catch (IllegalArgumentException e) { if(isThrowIfPropertyNotFound()) { throw new SchedulerException( "The setter on Job class " + obj.getClass() + " for property '" + name + "' expects a " + paramType + " but was given " + o.getClass(),e ); } if(isWarnIfPropertyNotFound()) { log.warn( "The setter on Job class " + obj.getClass() + " for property '" + name + "' expects a " + paramType + " but was given a " + o.getClass(), e); } continue; } catch (IllegalAccessException e) { if(isThrowIfPropertyNotFound()) { throw new SchedulerException( "The setter on Job class " + obj.getClass() + " for property '" + name + "' could not be accessed.", e); } if(isWarnIfPropertyNotFound()) { log.warn( "The setter on Job class " + obj.getClass() + " for property '" + name + "' expects a " + paramType + "' could not be accessed.", e); } continue; } catch (InvocationTargetException e) { if(isThrowIfPropertyNotFound()) { throw new SchedulerException( "The setter on Job class " + obj.getClass() + " for property '" + name + "' could not be accessed.", e); } if(isWarnIfPropertyNotFound()) { log.warn( "The setter on Job class " + obj.getClass() + " for property '" + name + "' expects a " + paramType + "' could not be accessed.", e); } continue; } } } private java.lang.reflect.Method getSetMethod(String name, PropertyDescriptor[] props) { for (int i = 0; i < props.length; i++) { java.lang.reflect.Method wMeth = props[i].getWriteMethod(); if(wMeth == null) continue; if(wMeth.getParameterTypes().length != 1) continue; if (wMeth.getName().equals(name)) return wMeth; } return null; } /** * Whether the JobInstantiation should fail and throw and exception if * a key (name) and value (type) found in the JobDataMap does not * correspond to a proptery setter on the Job class. * * @return Returns the throwIfNotFound. */ public boolean isThrowIfPropertyNotFound() { return throwIfNotFound; } /** * Whether the JobInstantiation should fail and throw and exception if * a key (name) and value (type) found in the JobDataMap does not * correspond to a proptery setter on the Job class. * * @param throwIfNotFound defaults to <code>false</code>. */ public void setThrowIfPropertyNotFound(boolean throwIfNotFound) { this.throwIfNotFound = throwIfNotFound; } /** * Whether a warning should be logged if * a key (name) and value (type) found in the JobDataMap does not * correspond to a proptery setter on the Job class. * * @return Returns the warnIfNotFound. */ public boolean isWarnIfPropertyNotFound() { return warnIfNotFound; } /** * Whether a warning should be logged if * a key (name) and value (type) found in the JobDataMap does not * correspond to a proptery setter on the Job class. * * @param warnIfNotFound defaults to <code>true</code>. */ public void setWarnIfPropertyNotFound(boolean warnIfNotFound) { this.warnIfNotFound = warnIfNotFound; } }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?