Spring 之 @Scheduled 安排任务的4种方法

Spring提供了@Scheduled注解,  很好的支持了任务调度和基于cron表达式  的异步方法执行。可以将@Scheduled注解与触发器元数据一起添加到方法中。

在本文中,将以@Scheduled的4种不同方式展示其功能和方法。

阅读更多:Spring计时器任务

目录

1. @Scheduled注解
2.固定的延迟或固定的速率
3. Cron表达式
4.来自属性文件的Cron表达式
5.上下文配置中的Cron表达式

1. Spring @Scheduled注解

@Scheduled注解用于任务调度, 触发信息需要与此注解一起提供。

1.1。fixedDelay vs FixedRate vs cron

可以使用属性fixedDelayfixedRatecron提供触发信息。其中:

    1. fixedRate使Spring定期运行任务,即使最后一次调用可能仍在运行。
    2. fixedDelay特别控制最后一次执行完成时的下一个执行时间。
    3. cron是源自Unix cron实用程序的功能,根据您的要求有多种选择。

用法示例如下:

@Scheduled(fixedDelay =30000)
public void demoServiceMethod () {... }

@Scheduled(fixedRate=30000)
public void demoServiceMethod () {... }

@Scheduled(cron="0 0 * * * *")
public void demoServiceMethod () {... }

1.2。如何启用@Scheduled注解

@Scheduled在spring应用程序中使用,必须首先在applicationConfig.xml文件中定义以下xml名称空间和模式位置定义。还要添加task:annotation-driven以启用基于注解的任务计划。

xmlns:task="http://www.springframework.org/schema/task"
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd

<task:annotation-driven>

上面的添加是必要的,因为我们将使用基于注解的配置。

1.3。使用@Scheduled注解

下一步是在类中创建一个类和一个方法,如下所示:

public class DemoService
{
	@Scheduled(cron="*/5 * * * * ?")
	public void demoServiceMethod()
	{
		System.out.println("Method executed at every 5 seconds. Current time is :: "+ new Date());
	}
}

在上述示例中–

  1. @Scheduled反过来,使用注解会使Spring容器了解该注解下面的方法将作为job运行。
  2. 请记住,带有注解的方法@Scheduled不应将参数传递给它们。
  3. 他们也不应返回任何值。
  4. 如果希望在@Scheduled方法中使用外部对象,则应DemoService使用 Autowire 将它们注入到类中,而不是将它们作为参数传递给@Scheduled方法。

2.固定延迟或固定速率的@Scheduled

在此方法中,fixedDelay属性与@Scheduled注解一起使用。或者,也可以使用fixedRate

示例类如下所示:

package com.how2codex.service;

import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;

public class DemoServiceBasicUsageFixedDelay
{
	@Scheduled(fixedDelay = 5000)
	//@Scheduled(fixedRate = 5000)	//Or use this
	public void demoServiceMethod()
	{
		System.out.println("Method executed at every 5 seconds. Current time is :: "+ new Date());
	}
}

应用程序配置如下所示:

< ?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:task="http://www.springframework.org/schema/task"
 xmlns:util="http://www.springframework.org/schema/util"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 		http://www.springframework.org/schema/context/ http://www.springframework.org/schema/context/spring-context.xsd
 		http://www.springframework.org/schema/util/ http://www.springframework.org/schema/util/spring-util.xsd
      	http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">

    <task:annotation-driven />

    <bean id="demoServiceBasicUsageFixedDelay" class="com.how2codex.service.DemoServiceBasicUsageFixedDelay"></bean>

</beans>

3. 使用cron表达式的@Scheduled

在此方法中,cron属性与@Scheduled注解一起使用。此属性的值必须是cron表达式。

示例类如下所示:

package com.how2codex.service;

import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;

public class DemoServiceBasicUsageCron
{
	@Scheduled(cron="*/5 * * * * ?")
	public void demoServiceMethod()
	{
		System.out.println("Method executed at every 5 seconds. Current time is :: "+ new Date());
	}
}

应用程序配置如下所示:

< ?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:task="http://www.springframework.org/schema/task"
 xmlns:util="http://www.springframework.org/schema/util"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 		http://www.springframework.org/schema/context/ http://www.springframework.org/schema/context/spring-context.xsd
 		http://www.springframework.org/schema/util/ http://www.springframework.org/schema/util/spring-util.xsd
      	http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">

    <task:annotation-driven />

    <bean id="demoServiceBasicUsageCron" class="com.how2codex.service.DemoServiceBasicUsageCron"></bean>

</beans>

4.属性文件中的Cron表达式

在此方法中,cron属性与@Scheduled注解一起使用。此属性的值必须是cron表达式,如以前的方法一样,但是,此cron表达式将在属性文件中定义,并且相关属性的键将在@Scheduled注解中使用。

这将使cron表达式与源代码脱钩,从而使更改变得容易。

package com.how2codex.service;

import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;

public class DemoServicePropertiesExample {

	@Scheduled(cron = "${cron.expression}")
	public void demoServiceMethod()
	{
		System.out.println("Method executed at every 5 seconds. Current time is :: "+ new Date());
	}

}

应用程序配置如下所示:

<?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:task="http://www.springframework.org/schema/task"
 xmlns:util="http://www.springframework.org/schema/util"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 		http://www.springframework.org/schema/context/ http://www.springframework.org/schema/context/spring-context.xsd
 		http://www.springframework.org/schema/util/ http://www.springframework.org/schema/util/spring-util.xsd
      	http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">

    <task:annotation-driven />

    <util:properties id="applicationProps" location="application.properties" />

	<context:property-placeholder properties-ref="applicationProps" />

    <bean id="demoServicePropertiesExample" class="com.how2codex.service.DemoServicePropertiesExample"></bean>

</beans>

5.上下文配置中的Cron表达式

在这种方法中,在属性文件中配置了cron表达式,并使用属性密钥为cron表达式在配置文件中配置了作业调度。主要的变化是您不需要@Scheduled在任何方法上使用注解。方法配置也在应用程序配置文件中完成。

示例类如下所示:

package com.how2codex.service;

import java.util.Date;

public class DemoServiceXmlConfig
{
	public void demoServiceMethod()
	{
		System.out.println("Method executed at every 5 seconds. Current time is :: "+ new Date());
	}

}

应用程序配置如下所示:

<?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:task="http://www.springframework.org/schema/task"
 xmlns:util="http://www.springframework.org/schema/util"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 		http://www.springframework.org/schema/context/ http://www.springframework.org/schema/context/spring-context.xsd
 		http://www.springframework.org/schema/util/ http://www.springframework.org/schema/util/spring-util.xsd
      	http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">

    <task:annotation-driven />

    <util:properties id="applicationProps" location="application.properties" />

	<context:property-placeholder properties-ref="applicationProps" />

	<bean id="demoServiceXmlConfig" class="com.how2codex.service.DemoServiceXmlConfig" />

	<task:scheduled-tasks>
	  	<task:scheduled ref="demoServiceXmlConfig" method="demoServiceMethod" cron="#{applicationProps['cron.expression']}"></task:scheduled>
	</task:scheduled-tasks>

</beans>

让我知道我是否想念任何东西。

学习愉快!

参考:

http://forum.springsource.org/showthread.php?83053-Feature-Scheduled-with-Value-cron-expression

saigon has written 1440 articles

Leave a Reply