所以我换了一种方法,可以实现同样的效果。
我建议只设置一定数量的Job(其实一个就可以,比如你的任务是1个小时倍数的周期,可以设配置1个小时触发一次),然后调用检查所有需要运行的任务(可以建一张类似Job的业务表,记录cronExpression和延时时时间),然后用cronExpression.getNextValidTimeAfter函数检查下一个单位时间需要运行的任务,然后可以用其他的类似Timer来做定时执行。
请根据具体业务来设计,希望对你有帮助,谢谢!
spring 4.x没有配置过,这里有一个spring 3.x 的quartz定时配置,你参考参考:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<!--
1 、JobDetail:JobDetail是一个具体的类。
2、Trigger:触发器,它用于定义Job何时执行。最常用的是SimpleTrigger和CronTrigger。
一般来说,如果你需要在一个固定的时间和重复次数或者一个固定的间隔时间,那么SimpleTrigger比较合适;
如果你有许多复杂的作业调度,那么CronTrigger比较合适。
CronTrigger和 Unix的cron机制基本一样,我们需要的只是一个cron表达式。
比如“0 0 12 * * ?”会在每天中午12点触发执行;“0 15 10 ? * 6L”会在每个月的最后一个星期五的早上10:15触发Job执行。
3、 Scheduler和 SchedulerFactory:Scheduler负责管理 Trigger、调度 Job,
SchedulerFactory则是Scheduler工厂,负责生成Scheduler。
-->
<!-- 总管理类如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false">
<!-- 通过applicationContextSchedulerContextKey属性配置spring上下文 [此属性可省略] -->
<property name="applicationContextSchedulerContextKey">
<value>applicationContext</value>
</property>
<property name="triggers">
<list>
<!--作业调度器,list下可加入其他的调度器-->
<ref bean="testTrigger" />
</list>
</property>
<property name="autoStartup" value="true" />
</bean>
<!--要调度的对象-->
<bean id="testJob" class="name.zealze.test.JobTest" />
<bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="testJobDetail" />
<!-- 按cron表达式时间点触发事件 http://cron.qqe2.com/ -->
<property name="cronExpression" value="0 0/2 * * * ?" />
</bean>
<bean id="testJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="testJob" />
<property name="targetMethod" value="execute" />
<!-- 是否允许任务并发执行。当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程 -->
<property name="concurrent" value="false" />
</bean>
</beans>
主要有三个核心概念:调度器、任务和触发器。三者关系简单来说就是,调度器负责调度各个任务,到了某个时刻或者过了一定时间,触发器触动了,特定任务便启动执行。概念相对应的类和接口有:
1)JobDetail:望文生义就是描述任务的相关情况;
2)Trigger:描述出发Job执行的时间触发规则。有SimpleTrigger和CronTrigger两个子类代表两种方式,一种是每隔多少分钟小时执行,则用SimpleTrigger;另一种是日历相关的重复时间间隔,如每天凌晨,每周星期一运行的话,通过Cron表达式便可定义出复杂的调度方案。
3)Scheduler:代表一个Quartz的独立运行容器,Trigger和JobDetail要注册到Scheduler中才会生效,也就是让调度器知道有哪些触发器和任务,才能进行按规则进行调度任务。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)