2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > quartz实现每周一至周五 非法定节假日 每天9:30-11:30 13:00-15:00执行定时任务

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

时间:2023-11-03 13:01:43

相关推荐

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,但是该类只能排除某一个法定节假日,无法方便的排除一个列表的节假日,因此需要自己扩展该类,代码如下:

[html]view plaincopyprivatestaticLoggerlogger=Logger.getLogger(TradeDayCalendar.class); //默认的时间格式。 publicstaticStringDEFAULT_DATE_FROMART="yyyy-MM-dd"; //时间格式。 privateStringdateFormat=DEFAULT_DATE_FROMART; publicStringgetDateFormat(){ returndateFormat; } /** *设置日期格式。 *@paramdateFormat */ publicvoidsetDateFormat(StringdateFormat){ this.dateFormat=dateFormat; } publicTradeDayCalendar(){ } publicTradeDayCalendar(CalendarbaseCalendar){ super(baseCalendar); } publicTradeDayCalendar(TimeZonetimeZone){ super(timeZone); } publicTradeDayCalendar(CalendarbaseCalendar,TimeZonetimeZone){ super(baseCalendar,timeZone); } /** *构造一个日历对象,排除指定的那些法定节假日。 *@paramstringDates日期列表字符串,一个日期列表字符串,多个日期以逗号隔开,默认的日期格式是yyyy-MM-dd.例如:-1-01,-10-01 */ publicTradeDayCalendar(StringstringDates){ this(null,stringDates); } /** *构造一个日历对象,排除指定的那些法定节假日。 * *@parambaseCalendar,与本日历对象关联的基础日历对象,在基础日历对象的基础上再排除指定的法定节假日,可以是null。 *@paramstringDates日期列表字符串,一个日期列表字符串,多个日期以逗号隔开,默认的日期格式是yyyy-MM-dd.例如:-1-01,-10-01 */ publicTradeDayCalendar(CalendarbaseCalendar,StringstringDates){ super(baseCalendar); //将日期字符串解析成字符数组。 String[]stringDatesArray=stringDates.split(","); Date[]dates=null; try{ dates=getDatesFromStrings(stringDatesArray); }catch(ParseExceptione){ logger.error(e.getMessage()); } if(dates!=null&&dates.length==stringDatesArray.length){ if(logger.isDebugEnabled()) logger.debug("Excludeddates:"+stringDates); addExcludedDates(dates); }else{ //某些日期无法解析。 thrownewIllegalArgumentException( "Someconfigureddateswereinvalids(notparseableas" +dateFormat+").Fulllistofconfigureddates{" +stringDates+"}validdates"+stringDates); } } /** *将日历字符串数组,按照默认的日期格式转换为Date类型的数组。 *@paramstringDatesArray日期字符串数组。 *@return转换后的Date型的数组。 *@throwsParseException输入的日期解析出错,日期格式有问题。 */ privateDate[]getDatesFromStrings(String[]stringDatesArray)throwsParseException{ if(stringDatesArray==null||stringDatesArray.length==0) returnnull; Date[]dates=newDate[stringDatesArray.length]; for(inti=0;i<stringDatesArray.length;i++){ StringstringDate=stringDatesArray[i]; SimpleDateFormatsimpleDateFormat=newSimpleDateFormat(dateFormat); dates[i]=simpleDateFormat.parse(stringDate); } returndates; } /** *循环添加数组中的日期到被排除的日期列表中,会跳过那些无法解析的日期。 */ privatevoidaddExcludedDates(Date[]dates){ for(inti=0;i<dates.length;i++){ DatelegalHoliday=dates[i]; addExcludedDate(legalHoliday); } }

为了方便修改法定节假日,可以将法定节假日的配置放在java properties文件中。[html]view plaincopy<beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <propertyname="ignoreUnresolvablePlaceholders"value="true"/> <propertyname="location"value="classpath:application.properties"/> </bean> tradeDays.legalHolidays=-01-01,-10-01,-07-15

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

[html]view plaincopy<!--配置监控上交所行情的任务。--> <beanid="monitorShow"class="com.cssweb.quote.realtime.oracle.MonitorShow"/> <beanid="monitorShowJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <propertyname="targetObject"ref="monitorShow"/> <propertyname="targetMethod"value="run"/> </bean> <!--配置上午监控上交所的任务触发器。--> <beanid="monitorShowAMTrigger"class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <propertyname="jobDetail"ref="monitorShowJobDetail"/> <!--每隔一秒钟(1000毫秒)执行一次--> <propertyname="repeatInterval"value="1000"></property> <propertyname="calendarName"value="tradeTimeAMCalendar"></property> </bean> <!--配置下午监控上交所的任务触发器。--> <beanid="monitorShowPMTrigger"class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <propertyname="jobDetail"ref="monitorShowJobDetail"/> <!--每隔一秒钟(1000毫秒)执行一次--> <propertyname="repeatInterval"value="1000"></property> <propertyname="calendarName"value="tradeTimePMCalendar"></property> </bean> <!--排除周六和周日的日历。--> <beanid="excludeWeekendsCalendar"class="org.quartz.impl.calendar.WeeklyCalendar"/> <!--排除法定节假日的日历。--> <beanid="tradeDayCalendar"class="com.csc108.quartz.TradeDayCalendar"> <constructor-argref="excludeWeekendsCalendar"/> <constructor-argvalue="${tradeDays.legalHolidays}"/> </bean> <!--上午9:15到11:45的交易时间--> <beanid="tradeTimeAMCalendar"class="org.quartz.impl.calendar.DailyCalendar"> <constructor-argref="tradeDayCalendar"/> <constructor-argvalue="09:15"type="java.lang.String"/> <constructor-argvalue="11:45"type="java.lang.String"/> <!--includehoursbetweenstartandend--> <propertyname="invertTimeRange"value="true"/> </bean> <!--下午12:40到15:25的交易时间--> <beanid="tradeTimePMCalendar"class="org.quartz.impl.calendar.DailyCalendar"> <constructor-argref="tradeDayCalendar"/> <constructor-argvalue="12:45"type="java.lang.String"/> <constructor-argvalue="15:25"type="java.lang.String"/> <!--includehoursbetweenstartandend--> <propertyname="invertTimeRange"value="true"/> </bean> <!--上午和下午交易时间监控上交股票行情信息的任务调度。--> <beanid="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <propertyname="calendars"> <map> <entrykey="tradeTimeAMCalendar"value-ref="tradeTimeAMCalendar"/> <entrykey="tradeTimePMCalendar"value-ref="tradeTimePMCalendar"/> </map> </property> <propertyname="triggers"> <list> <refbean="monitorShowAMTrigger"/> <refbean="monitorShowPMTrigger"/> </list> </property> </bean>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。