spring + quartz简单使用笔记

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  		http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
  
  <bean id="monitorDeleteBiz" class="com.dataManager.job.MonitorDeleteJob"/>
  <bean id="monitorBiz" class="com.dataManager.job.MonitorJob"/>
  <bean id="reportBiz" class="com.dataManager.job.ReportJob"/>
  <bean id="warningBiz" class="com.dataManager.job.WarningJob"/> 
  
  <!-- 定义目标bean和bean中的方法 -->  
  <bean id="monitorDeleteTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="monitorDeleteBiz"/>
    <property name="targetMethod" value="execute"/>
   <!--  <property name="concurrent" value="false"/>不允许并发执行 -->
  </bean>
  <bean id="monitorTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="monitorBiz"/>
    <property name="targetMethod" value="execute"/>
  </bean> 
  <bean id="reportTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="reportBiz"/>
    <property name="targetMethod" value="execute"/>
  </bean> 
  <bean id="warningTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="warningBiz"/>
    <property name="targetMethod" value="execute"/>
  </bean>  
  
  <!-- ======================== 调度触发器 ======================== -->  
  <!--MonitorDeleteJob -->  
  <bean id="monitorDeleteTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <!--工作内容 -->  
    <property name="jobDetail" ref="monitorDeleteTask" />
    <!-- 循环时间间隔 -->  
    <property name="cronExpression" value="0 0 23 * * ?" />
  </bean>
  <!-- MonitorJob -->
  <bean id="monitorJobTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> 
    <!--工作内容 -->  
    <property name="jobDetail" ref="monitorTask" />
    <!-- 启动延迟  (调度工厂实例化后,经过0秒开始执行调度) -->
    <property name="startDelay" value="0" /> <!-- 毫秒 -->
    <!--  循环时间间隔   -->
    <property name="repeatInterval" value="20000" />
  </bean>
  <!-- ReportJob -->
  <bean id="reportJobTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> 
    <!-- 工作内容   -->
    <property name="jobDetail" ref="reportTask" />
    <!--   启动延迟   -->
    <property name="startDelay" value="100000" /> 
    <!-- 循环时间间隔   -->
    <property name="repeatInterval" value="3600000" />
  </bean>
    
  <!--WarningJob -->
  <bean id="warningJobTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> 
    <!--工作内容   -->
    <property name="jobDetail" ref="warningTask" />
    <!--启动延迟   -->
    <property name="startDelay" value="20000000" /> 
    <!-- 循环时间间隔   -->
    <property name="repeatInterval" value="20000000" />
  </bean>
  
  <!-- ======================== 调度工厂 ======================== -->  
  <bean id="SpringJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
      <list>
        <!-- 引入定时任务,可多个  -->  
        <ref bean="monitorDeleteTrigger"/>
        <ref bean="monitorJobTrigger"/>
        <ref bean="reportJobTrigger"/>
        <ref bean="warningJobTrigger"/>
      </list>
    </property>
  </bean>

</beans>

注意:Spring 3.0以上版本不在使用CronTriggerBean, 请使用CronTriggerFactoryBean。因为在Spring 3.0版本中,内置的Quartz版本是小于2.0的,而spring3.0以上使用的Quartz版本>=2.0接口不兼容, 请选择合适的版本并正确配置,否则会报错。


Quartz的两种使用方法

1.继承org.springframework.scheduling.quartz.QuartzJobBean类的方式

2.POJO + 配置 的方式

(推荐第二种,作业类只是一个简单的POJO,加上配置文件就可以运行,更加灵活!)

两种调度任务触发机制:

1.每隔指定时间则触发一次,对应的调度器为org.springframework.scheduling.quartz.SimpleTriggerBean

2.每到指定时间则触发一次,对应的调度器为org.springframework.scheduling.quartz.CronTriggerBean



package com.dataManager.job;

import java.sql.Timestamp;
import java.util.Date;

import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;

import com.dataManager.service.MonitorOutputService;
import com.dataManager.utility.log.Log4jConfig;
import com.dataManager.utility.log.Log4jConfigFactory;
import com.dataManager.utility.transformat.FormatCalendar;

/**
 * 使用一个简单的pojo 
 */
public class MonitorDeleteJob{
	private Log4jConfig logger = Log4jConfigFactory.create(MonitorDeleteJob.class);
	@Autowired
	private MonitorOutputService monitorOutputService;

	public void execute() throws JobExecutionException {
		Date date = new Date();
		try {
		    int m = monitorOutputService.deleteBeforeDate(
		                        FormatCalendar.offsetTime(date, 4, -1));
		    logger.debug((double) m, "", 
		              "定期删除监控数据:" + new Timestamp(date.getTime()));
		} catch (Exception e) {
			StackTraceElement[] trace = e.getStackTrace();
			logger.error(null, trace[0].getMethodName(), 
			                trace[0].getLineNumber(), e.toString());
		}
	}
	
	public static void main(String[] args) throws JobExecutionException {
		MonitorDeleteJob x = new MonitorDeleteJob();
		x.execute();
	}
}

======================== 以下不相关===================================

被调度的任务时一个简单的POJO,  execute方法的名字并不是强制规定,只不过刚开始写这段代码的时候,使用第一种方法,实现了InterruptableJob接口,其实不必如此。

在实际使用中一开始获取monitorOutputService的时候采用一下方式获得,这样在测试环境下是正确的,但是在项目正常启动的时候,hibernate开始无限循环的加载映射表与javaBean,导致系统启动超时。

private MonitorOutputService monitorOutputService = (MonitorOutputService) SpringBeanUtil
			.getSpringBean("monitorOutputService");
public static Object getSpringBean(String springBeanId) {
    if (UtilValidator.isEmpty(springBeanId)) {
	return null;
    }
    ApplicationContext applicationContext = getBeanFactory();
        if (applicationContext == null) {
	    return null;
	}
	if (!applicationContext.containsBean(springBeanId)) {
	    return null;
	}
	return applicationContext.getBean(springBeanId);
}
public static ApplicationContext getBeanFactory() {
    if (applicationContext == null) {
        if (!UtilValidator.isExistFileInClassPath(FILENAME_SPRING)) {
	    return null;
	}
	applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
	}
	return applicationContext;
}

 错误已经查清。。。有点坑----- 无限循环个applicationContext....hibernate死循环只是表象。。因为实在太多了。

六月 07, 2015 11:11:32 下午 org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues
信息: Mapping class: com.dataManager.entity.Calculate -> calculate
六月 07, 2015 11:11:32 下午 org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues
信息: Mapping class: com.dataManager.entity.CalType -> cal_type
六月 07, 2015 11:11:32 下午 org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues
................




转载于:https://my.oschina.net/dlam/blog/429115

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值