您的位置:首页 > 编程语言 > Java开发

Spring+Quarzt整合

2016-07-12 20:39 369 查看
原文链接:http://www.cnblogs.com/Caoxdong/p/5664797.html
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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: