SSM+Quartz定时器

  1. 添加maven依赖
<dependency>
	<groupId>org.quartz-scheduler</groupId>
	<artifactId>quartz</artifactId>
	<version>2.2.0</version>
</dependency>
  1. 编写spring-quartz配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:cache="http://www.springframework.org/schema/cache"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd 
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/cache
        http://www.springframework.org/schema/cache/spring-cache.xsd">
    <!-- 添加调度的任务bean 配置对应的类-->
    <bean id="myQuartz" class="com.zc.quarter.MyQuartz" />
    <!--配置调度具体执行的方法-->
    <bean id="myQuartzDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="myQuartz" />
		<property name="targetMethod" value="quartzTest" />
		<!-- 使用Quartz做计划任务时,默认情况下,当前任务总会执行,无论前一个任务是否结束 -->
		<!-- 下面的concurrent属性默认为true,设置成false可以让任务按照顺序执行,上一个任务没有结束,下面的任务不会执行-->
		<property name="concurrent" value="false" />
    </bean>
    <!--配置调度执行的触发的时间-->
    <bean id="myQuartzTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="myQuartzDetail" />
        <property name="cronExpression">
        	<!--每隔10秒执行一次-->
            <value>0/10 * * * * ?</value>
        </property>
    </bean>
    <!-- quartz的调度工厂只能有一个,多个调度任务在list中添加 -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="myQuartzTrigger" />
            </list>
        </property>
    </bean>
</beans>

Cron表达式可以自己了解,这里推荐一个在线生成Cron表达式生成器
3. 在web.xml里加载shiro-quartz.xml

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mybatis.xml,spring-quartz.xml</param-value>
</context-param>

或者在spring的主配置文件里加一下代码

<import resource="spring-quartz.xml" />

4.编写Java类

//注意这里的类名要跟spring-quartz.xml配置文件的目标类保持一致
public class MyQuartz{
	private Logger logger = Logger.getLogger(this.getClass());
	//注意这里的方法名要跟spring-quartz.xml配置文件的目标方法保持一致
	public void quartzTest(){
		//内容就是打印一句话
		System.out.println("执行定时任务...");
	}
}

结语:其中concurrent属性标识的解释为:对于相同的Detail,当指定多个Trigger时, 很可能第一个job完成之前,第二个job就开始了。指定concurrent设为false,多个job不会并发运行,第二个job将不会在第一个job完成之前开始。

那么此处的第二个job到底是被推迟执行了,还是被取消了呢? 今天带着这个疑问做了一个小实验,具体做法如下:将任务的Trigger设置为每10秒钟执行一次,然后在执行的任务体内让Thread暂停15秒钟,这样不同的job之间肯定会有时间上的重叠。当启动程序之后,发现前一个job执行结束的时刻的秒数为15,而且第二个本来在10s就执行的job马上就启动了。

由此可见,concurrent属性实际是将job推迟执行了。
结语转载至:http://nesuk.iteye.com/blog/1582557

SSM项目中使用Quartz进行定时任务可以按照以下步骤进行操作: 1. 配置依赖:在项目的`pom.xml`文件中添加Quartz的依赖。例如: ```xml<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> ``` 2. 创建定时任务类:在您的SSM项目中创建一个定时任务类,可以命名为`JobScheduleTask`。该类需要实现Quartz的`Job`接口,并实现其中的`execute`方法。在`execute`方法中编写定时任务的逻辑代码。 ```javapublic class JobScheduleTask implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 定时任务的逻辑代码 // ... } } ``` 3. 配置定时任务触发器:创建一个触发器类,可以命名为`JobScheduleTrigger`。在该类中,使用Quartz的`TriggerBuilder`来配置定时任务触发器的属性,例如执行时间、周期等。 ```javapublic class JobScheduleTrigger { public static Trigger createTrigger() { return TriggerBuilder.newTrigger() .withIdentity("jobScheduleTrigger") .withSchedule(CronScheduleBuilder.cronSchedule("000/1 * * ?")) // 每小时执行一次 .build(); } } ``` 4. 配置定时任务调度器:创建一个调度器类,可以命名为`JobScheduleScheduler`。在该类中,使用Quartz的`SchedulerFactory`来创建调度器实例,并配置相关属性,如数据源、任务存储等。然后使用调度器的`scheduleJob`方法将定时任务和触发器关联起来,并启动调度器。 ```javapublic class JobScheduleScheduler { public static void startScheduler() throws SchedulerException { SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); JobDetail jobDetail = JobBuilder.newJob(JobScheduleTask.class) .withIdentity("jobScheduleTask") .build(); Trigger trigger = JobScheduleTrigger.createTrigger(); scheduler.scheduleJob(jobDetail, trigger); scheduler.start(); } } ``` 5. 在Spring配置文件中配置调度器:在您的Spring配置文件(如`applicationContext.xml`)中,将定时任务调度器配置为一个Bean,并在其中调用`JobScheduleScheduler.startScheduler()`方法。 ```xml<bean id="jobScheduleScheduler" class="com.example.JobScheduleScheduler" init-method="startScheduler" /> ``` 6. 启动项目:启动您的SSM项目,定时任务调度器会根据配置的触发器时间和周期执行定时任务的逻辑。 请注意,以上步骤仅提供了一个基本示例,您可以根据实际需求进行修改和扩展。希望对您有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值