quartz实现每周一至周五 非法定节假日 每天9:30-11:30,13:00-15:00执行定时任务

我的定时任务需求是:使用quartz实现每周一至周五,非法定节假日,每天9:30-11:30,13:00-15:00执行定时任务。
经过学习quartz,发现使用SimperTrigger和CronTrgger这两种触发器都无法满足这种需求的表达,我始终无法相信强大的quartz绝对不可能无法实现这种需求。
经过别人的指点,终于在一篇法文的blog中找到了类似的解决办法,需要借助于quartz的Calender来实现这种需求,这个过程非常曲折,遇到了很多问题,总体感觉quartz虽然强大,但是社区的活跃程度不够,文档还不是非常完善,这也许是很多开源项目的通病,可能很多复杂一些的需求,直接从文档中无法得到答案,有时候需要自己去阅读源代码,阅读javadoc才能找到答案,解决这一问题后再次印证了那句话,黄天不负有心人,只要你坚持问题总能解决的,
 
下面进入正题。
 

对于排除法定节假日,可以使用HolidayCalendar,但是该类只能排除某一个法定节假日,无法方便的排除一个列表的节假日,因此需要自己扩展该类,代码如下:

        private static Logger logger = Logger.getLogger(TradeDayCalendar.class);
	
	//默认的时间格式。
	public static String DEFAULT_DATE_FROMART = "yyyy-MM-dd";
	
	//时间格式。
	private String dateFormat = DEFAULT_DATE_FROMART;

	public String getDateFormat() {
		return dateFormat;
	}

	/**
	 * 设置日期格式。
	 * @param dateFormat
	 */
	public void setDateFormat(String dateFormat) {
		this.dateFormat = dateFormat;
	}

	public TradeDayCalendar() {
	}

	public TradeDayCalendar(Calendar baseCalendar) {
		super(baseCalendar);
	}

	public TradeDayCalendar(TimeZone timeZone) {
		super(timeZone);
	}

	public TradeDayCalendar(Calendar baseCalendar, TimeZone timeZone) {
		super(baseCalendar, timeZone);
	}

	/**
	 * 构造一个日历对象,排除指定的那些法定节假日。
	 * @param stringDates 日期列表字符串,一个日期列表字符串,多个日期以逗号隔开,默认的日期格式是 yyyy-MM-dd. 例如 : 2010-1-01,2010-10-01
	 */
	public TradeDayCalendar(String stringDates) {
		this(null, stringDates);
	}

	/**
	 *  构造一个日历对象,排除指定的那些法定节假日。
	 *
	 * @param baseCalendar, 与本日历对象关联的基础日历对象,在基础日历对象的基础上再排除指定的法定节假日,可以是null。
	 * @param stringDates 日期列表字符串,一个日期列表字符串,多个日期以逗号隔开,默认的日期格式是 yyyy-MM-dd. 例如 : 2010-1-01,2010-10-01
	 */
	public TradeDayCalendar(Calendar baseCalendar, String stringDates) {
		super(baseCalendar);

		//将日期字符串解析成字符数组。
		String[] stringDatesArray = stringDates.split(",");
		Date[] dates = null;
		try {
			dates = getDatesFromStrings(stringDatesArray);
		} catch (ParseException e) {
			logger.error(e.getMessage());
		}

		if (dates != null && dates.length == stringDatesArray.length) {
			if (logger.isDebugEnabled())
				logger.debug("Excluded dates : " + stringDates);
			addExcludedDates(dates);
		} else {
			//某些日期无法解析。
			throw new IllegalArgumentException(
					"Some configured dates were invalids (not parseable as "
							+ dateFormat + "). Full list of configured dates{"
							+ stringDates +"} valid dates " +stringDates);
		}
	}

	/**
	 * 将日历字符串数组,按照默认的日期格式转换为Date类型的数组。
	 * @param stringDatesArray 日期字符串数组。
	 * @return 转换后的Date型的数组。
	 * @throws ParseException 输入的日期解析出错,日期格式有问题。
	 */
	private Date[] getDatesFromStrings(String[] stringDatesArray) throws ParseException{
		if(stringDatesArray==null || stringDatesArray.length==0)
			return null;
		Date[] dates = new Date[stringDatesArray.length];
		for(int i=0; i

为了方便修改法定节假日,可以将法定节假日的配置放在java properties文件中。


	
	

tradeDays.legalHolidays=2010-01-01,2010-10-01,2010-07-15

在Spring配置文件中继续配置定时任务,配置如下:

	
	
	
		
		
	
	
	
		
		
		
		
	
	
	
		
		
		
		
	
 
	
	
	
	
	
		
		
	

	
	
		
		
		
		
		
	

	
	
		
		
		
		
		
	
 
	
	
		
			
				
				
			
		
		
			
				
				
			
		
	


你可能感兴趣的:(spring,java)