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;

  

转载于:https://www.cnblogs.com/Caoxdong/p/5664797.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值