由Quartz直接调度任务类的某个接口,那么,业务类是不必进行任何修改的。我们的业务类大概如下
public classBusinessReport {
public voidperform(){ //执行报表统计入口函数
//业务逻辑
}
}
第一步,在Spring配置文件中增加本业务类
<bean id="businessReport " class="com.zhwyd.service.BusinessReport "/>
第二步,定义任务。在Spring配置文件中配置代理类MethodInvokingJobDetailFactoryBean,定义任务的详细信息。
<bean id="reportTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name=" targetObject" ref=" businessReport " />
<property name=" targetMethod" value="perform" />
<property name=" concurrent" value=" false " />
</bean>
这个配置告诉Spring,我们的任务是执行id为businessReport的bean中的perform函数。其中参数concurrent告诉Spring,不要并发运行这个任务。
第三步,配置一个触发器。在Spring配置文件中配置触发器类CronTriggerBean。
<bean id="cronTrigger"class="org.springframework.scheduling.quartz.CronTriggerBean">
<propertyname="jobDetail" ref="reportTask " />
<propertyname="cronExpression" value="0 0 1 1 * ?" />
</bean>
触发器将告诉Quartz两件事:在何时触发任务、触发哪个任务。其中属性参数cronExpression为调度时间,格式和unix上的crontab类似,具体见下表1。“00 1 1 * ?”表示每月1日凌晨1点运行。其中问号表示忽略该位置(星期)上的值。属性参数jobDetail指向具体的任务bean:reportTask 。如果你有多个任务,每个任务的触发时间都不一样,则你可以在此配置多个不同的触发器。
表1. cronExpression的时间格式
位置 - 含义
1 - 秒(0–59)
2 - 分(0–59)
3 - 时(0–23)
4 - 日(1–31)
5 - 月(1–12)
6 - 星期(SUN–SAT or1–7)
7 - 年(可选, 1970–2099)
第四步,配置一个调度器。在Spring配置文件中配置调度器类SchedulerFactoryBean。
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<propertyname="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
</bean>
该调度器用于管理触发器。只有在调度器中列表出现的触发器才被Quartz系统调度执行。至此,所有的配置已完成,任务已能正常跑了。
<bean id="yhzdRenwuDiaoduController" class="com.westerasoft.si.yhzd.controller.YhzdRenwuDiaoduController"> <property name="yhzdZhuanjiaGuizeKuService" ref="yhzdZhuanjiaGuizeKuService" /> <property name="queryAssistant" ref="queryAssistant" /> </bean> <bean id="renwuDiaoduJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="yhzdRenwuDiaoduController" /> <property name="targetMethod" value="zhenduan" /> <property name="concurrent" value="false" /> </bean> <bean id="renwuDiaoduJob1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="yhzdRenwuDiaoduController" /> <property name="targetMethod" value="shishi" /> <property name="concurrent" value="false" /> </bean> <bean id="yhzdRenwuDiaoduCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="renwuDiaoduJob" /> </property> <property name="cronExpression"> <value>0 0 0 * * ?</value> //0秒执行 </property> </bean> <bean id="yhzdRenwuDiaoduCronTrigger1" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="renwuDiaoduJob1" /> </property> <property name="cronExpression"> <value>0 50 14 * * ?</value> //下午2点50分执行 </property> </bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no"> <property name="triggers"> <list> <ref local="yhzdRenwuDiaoduCronTrigger" /> <ref local="yhzdRenwuDiaoduCronTrigger1" /> </list> </property> </bean>
com.westerasoft.si.yhzd.controller.YhzdRenwuDiaoduController这个类里面必须zhenduan和shishi两个方法:zhenduan和shishi这个类不需要继承任何接口和实现任何类!而且这两个方法无参也无返回值。如:
public void zhenduan() throws Exception { Map<String, Object> map = new HashMap<String, Object>(); map.put("runmode", "否"); List<YhzdZhuanjiaGuizeKu> objlist = yhzdZhuanjiaGuizeKuService.findByMap(map); if (objlist != null && objlist.size() > 0) { for (YhzdZhuanjiaGuizeKu obj : objlist) { String beanName = obj.getHolderName(); String isrun = obj.getIsrun(); if (isrun != null && !"".equals(isrun) && "启动".equals(isrun)) { YhzdGuiZeChuliJieKou jk = (YhzdGuiZeChuliJieKou) SpringBeanFactory.getBean(beanName); jk.holder(obj); } } } System.out.println("隐患诊断 普通 规则任务调度访问方法====访问时间:" + new Date().toString()); } public void shishi() throws Exception { Map<String, Object> map = new HashMap<String, Object>(); map.put("runmode", "是"); List<YhzdZhuanjiaGuizeKu> objlist = yhzdZhuanjiaGuizeKuService.findByMap(map); if (objlist != null && objlist.size() > 0) { for (YhzdZhuanjiaGuizeKu obj : objlist) { String beanName = obj.getHolderName(); String isrun = obj.getIsrun(); if (isrun != null && !"".equals(isrun) && "启动".equals(isrun)) { YhzdGuiZeChuliJieKou jk = (YhzdGuiZeChuliJieKou) SpringBeanFactory.getBean(beanName); jk.holder(obj); } } } System.out.println("隐患诊断 实时 规则任务调度访问方法1111====访问时间:" + new Date().toString()); }