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;