Spring+Quarzt整合
Quarzt有三个核心概念:调度器,任务和触发器 (jobDeail/Trigger/Scheduler) 配置Quarzt: 步骤:1.创建 JobDetail和Trigger 2.讲 JobDetail和Trigger 注册到Scheduler中 3.用Triggerhe和JobDetail 中的任务进行调度 1.配置:spring.xml 第一种配置方式 <!-- 配置任务 --> <bean name="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean" p:jobClass="com.test.quarztTest" p:applicationContextJobDataKey="applicationContext"> <property name="jobDataAsMap"> <map> <entry key="size" value="10" /> <map> </property> </bean> <!-- 配置触发器 --> <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean" p:jobDetail-ref="jobDetail" --引用的jobDetail p:startDelay="1000", --延迟多长时间开始触发 单位为毫秒 默认 0 p:repeatInterval="2000" --间隔时间 P:repeatCount="100"> --重复次数 <property name="jobDataAsMap"> <map> <entry key="count" value="10"/> </map> </property> </bean> <!-- 配置调度器 --> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list><ref bean="AutomaticOrderTrigger"/></list> </property> <property name="schedulerContextAsMap"> <map> <entry key="timeout" value="30"/> </map> </property> </bean> 最后实体类 必须继承job接口 publicclass quarztTest implements Job { public void execute(JobExecutionContext jctx) throws JobExecutionException{ Map dataMap = jctx.getJobDetail().getJobDataMap(); String size = (String)dataMap.get('size'); //获取在xml定义的datamap中的值 //获取spring容器 ApplicationContext cxd = (ApplicationContext)dataMap.get("applicationContext");//可以访问容器中的bean了 } } 第二种 注解配置 package com.zhangk.babysitter.controller.quarzt; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import com.zhangk.babysitter.service.babysitter.BabysitterService; @Component public class AutomaticOrder { @Autowired private BabysitterService babysitterService; @Autowired private SessionFactory factory; @Scheduled(cron = "0/5 * * * * ?") public void orderByBabysitter() { //方法体 } } spring xml配置 <task:annotation-driven scheduler="AutomaticScheduler" mode="proxy"/> <task:scheduler id="AutomaticScheduler" pool-size="10"/> //同时只能运行10项目 但是这种方法会在执行数据库操作的时候 会报没有session的错误 网上有很多说没有配置openSessionInView 的缘故 想了很久 问题就在于 如果你想在项目启动的时候 他就自动运行的话 因为你不是发的请求 所以 你不会被 openSessionInView 所拦截 也就不会打开session 导致后续报错 反之 如果是发一个请求来开启任务的话 也就不会报这个没有session的错了 解决办法 手动开启 发请求 或者在执行该方法的时候 打开一个session;