`
simple1024
  • 浏览: 74312 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring定时器用Annotation实现

阅读更多

spring定时器用Annotation实现

 

由于项目中需要定时更新一些数据,所以用到了spring的定时器,在使用Quartz过程中,遇到了一些麻烦,最终牵扯的错误太多:

1、我的一个Service类中需要加入定时执行即Service extends QuartzJobBean,但是Service类中使用@Autowired注入了属性:dao对象

2、在executeInternal方法执行过程中,dao对象一直为null。

3、尝试了各种办法,最终在配置文件中这样配置(这种配置网上多的是)

使用jobDataAsMap这个属性

<bean id="quartzClock" class="org.springframework.scheduling.quartz.JobDetailBean">
        <property name="jobClass">
            <value>org.wapgame.service.charts.Service</value>
        </property>
        <property name="jobDataAsMap">
            <map>
                  <entry key="dao" value-ref="Dao"/>
                  <entry key="test" value="30"/>
             </map>
        </property>
 </bean>

4、executeInternal方法中使用其参数来获得值。

protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
    // TODO Auto-generated method stub
    JobDataMap map=arg0.getMergedJobDataMap();
    int test = Integer.parseInt(map.get("test").toString());
    log.debug("test:"+test);
    playerDao=(PlayerDao)map.get("playerDao");
  }

这样就解决了注入的对象为null的问题。网上找了好多找不到解决的办法,最终还得靠自己。

5、解决是解决了,但是过程中我需要用到事务操作。随之带来了很大的麻烦,毕竟项目用的都是Annotaion,再加上自己在ApplicationContext.xml中配置,造成了很多麻烦和异常。

6、放弃,转Annotation

 


通过 注解 来调度任务
1、
AnnotationQuartz类:
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class AnnotationQuartz {
  @Scheduled(cron="0,10,20,30,40,50 * * * * ?")   //需要注意@Scheduled这个注解,它可配置多个属性:cron\fixedDelay\fixedRate
  public void test()
  {
    System.out.println("0.0");
  }
}

2、
spring的ApplicationContext.xml中的配置:
只需要加上
<!--  定时器开关  开始-->
    <task:annotation-driven/>
<!--  定时器开关  结束-->


3、(如果是web应用,那么需要再web.xml中加入)
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

通过 配置文件 来调度任务
1、
AnnotationQuartz类:
import org.springframework.stereotype.Component;

@Component(如果你的项目使用的是注解而不是配置文件中写bean,那么需要加上@Component,确保这个类已经注入)
public class AnnotationQuartz {
  public void test()
  {
    System.out.println("0.0");
  }
}
2、
spring的ApplicationContext.xml中的配置:
<task:scheduled-tasks> 
    <task:scheduled ref="chartsService" method="test" cron="0 0,15,30,45 * * * ?"/> 
</task:scheduled-tasks>

最后请注意 :(ApplicationContext.xml)
a)、需要在xmlns里面加入:
xmlns:task="http://www.springframework.org/schema/task"

b)、在xsi:schemaLocation中加入
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd(别忘了最后的引号)

 

 

cron表达式去搜吧,好多,我搜到了一些,如下:

<!--

一个cron表达式有到少6个(也可能是7个)由空格分隔的时间元素.从左到右,这些元素的定义如下: 
              1.秒(0-59) 
              2.分钟(0-59) 
              3.小时(0-23) 
              4.月份中的是期(1-31) 
              5.月份(1-12或SUN-DEC) 
              6.星期中的日期(1-7或SUN-SAT) 
              7.年份(1970-2099)  
                 例子: 
                  0 0 10,14,16 * * ? 每天上午10点,下午2点和下午4点 
                  0 0,15,30,45 * 1-10 * ? 每月前10天每隔15分钟 
                  30 0 0 1 1 ? 2012 在2012年1月1日午夜过30秒时 
                  0 0 8-5 ? * MON-FRI 每个工作日的工作时间 
              - 区间 
              * 通配符 
              ? 你不想设置那个字段 

-->

7
1
分享到:
评论
2 楼 simple1024 2011-12-03  
json20080301 写道
我补充一下,停止,暂停,和继续的方法

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("context/context-comm-mail.xml");
ctx.start();
org.quartz.impl.StdScheduler Scheduler = ctx.getBean("scheduler", org.quartz.impl.StdScheduler.class);
try {
System.out.println("-----------------------------暂停 mailJob");
Thread.sleep(5000);//Scheduler.shutdown();完全停止
Scheduler.pauseTrigger("mailJob", null); //暂停
System.out.println("-----------------------------重启 mailJob");
Thread.sleep(100000);//Scheduler.shutdown();
Scheduler.resumeTrigger("mailJob", null); //继续
} catch (Exception e) {
// TODO: handle exception
}



呵呵,不错不错
1 楼 json20080301 2011-12-02  
我补充一下,停止,暂停,和继续的方法

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("context/context-comm-mail.xml");
ctx.start();
org.quartz.impl.StdScheduler Scheduler = ctx.getBean("scheduler", org.quartz.impl.StdScheduler.class);
try {
System.out.println("-----------------------------暂停 mailJob");
Thread.sleep(5000);//Scheduler.shutdown();完全停止
Scheduler.pauseTrigger("mailJob", null); //暂停
System.out.println("-----------------------------重启 mailJob");
Thread.sleep(100000);//Scheduler.shutdown();
Scheduler.resumeTrigger("mailJob", null); //继续
} catch (Exception e) {
// TODO: handle exception
}

相关推荐

    spring定时器 spring定时器

    Spring定时器,也被称为Spring Boot的定时任务,是Spring框架中的一个强大功能,它允许开发者在应用程序中安排周期性任务的执行。这个功能基于Java的`java.util.concurrent.ScheduledExecutorService`,并通过Spring...

    spring定时器简单的demo

    这个"spring定时器简单的demo"应该包含了一个使用Spring Task实现简单定时任务的例子。 首先,Spring Task的配置通常在`applicationContext.xml`文件中进行。在这个配置文件中,我们需要启用Spring的Task执行器,这...

    spring定时器实现源码

    在本篇中,我们将深入探讨如何在 Spring 框架中实现定时任务功能,特别是使用 Spring MVC 和 Maven 进行构建的情况。 首先,Spring 提供了一个名为 `TaskScheduler` 的接口,用于执行定时任务。这个接口允许我们...

    spring定时器代码部分实现

    根据给定的信息,我们将重点放在“Spring定时器”的知识点上,并尝试从提供的混乱文本中提取出可能相关的代码片段或概念。 ### Spring定时器基础知识 在Java应用开发中,特别是使用Spring框架进行的企业级应用开发...

    spring定时器的包和配置文件

    在标题"spring定时器的包和配置文件"中,我们讨论的核心是Spring如何配置和使用定时器来自动化执行特定的任务。 首先,让我们了解Spring定时任务的基本概念。Spring定时器基于Java的`java.util.Timer`和`java.util....

    spring定时器

    以上内容详细介绍了Spring定时器的相关知识点,包括其基本概念、不同类型的定时器以及实际应用中的配置和实现方法。通过理解和掌握这些知识,开发者可以更高效地利用Spring框架来实现复杂的定时任务功能。

    spring定时器时间配置

    本文旨在深入解析Spring定时器的时间配置规则,并通过具体的代码示例进行演示。 #### Cron表达式的构成 Cron表达式由六个或七个空格分隔的时间元素组成,这些元素分别代表: 1. **秒** (0–59) 2. **分钟** (0–59...

    spring定时器,定时调用任务配置

    本篇将详细介绍如何配置和使用Spring的定时器来定时调用任务。 首先,让我们了解Spring Task的核心组件。`TaskExecutor`接口用于异步执行任务,而`TaskScheduler`接口则用于调度定时任务。在这个场景中,我们将重点...

    JAVA获取当前时间以及JAVA_Spring定时器

    Spring定时器(TaskScheduler或ScheduledTasks): 在Spring框架中,我们可以利用`@Scheduled`注解和`TaskScheduler`接口来实现定时任务。`@Scheduled`注解可以直接在方法上,声明该方法为周期性执行的任务。例如: ...

    spring 定时器

    本文将围绕“Spring定时器”这一主题,从其实现机制、配置方法以及具体应用等方面进行深入探讨。 #### 二、Spring定时器的实现原理 Spring定时器主要通过`java.util.Timer`和`java.util.concurrent....

    Spring定时器TimerTask用法

    **Spring定时器TimerTask用法** 在Java世界中,`java.util.Timer` 和 `java.util.TimerTask` 是用于实现定时任务的基本工具,但它们在多线程环境中的表现并不理想,容易引发内存泄漏。Spring框架提供了更强大的定时...

    spring定时器的一个简单应用.doc

    1. **配置Spring定时器**:在Spring配置文件(如`applicationContext.xml`)中,你需要定义一个`TaskScheduler`的bean,通常使用`ThreadPoolTaskScheduler`实现。例如: ```xml ...

    spring定时器.rarspring定时器.rarspring定时器.rarspring定时器.rarspring定时器.rarspring定时器.rar

    Spring定时器,也被称为Spring Task或者Spring Batch,是Spring框架的一部分,用于实现应用程序中的定时任务。这个功能在企业级应用中非常常见,例如定期备份、数据清理、日志归档等。Spring定时器通过集成Quartz或...

    ESSH整合Spring 定时器配置

    在ESSH体系下,整合Spring的定时任务功能,可以实现高效且灵活的后台任务调度。 首先,我们需要明白Spring的定时器是如何工作的。Spring通过`org.springframework.scheduling`包提供的接口和类来支持定时任务。最...

    spring定时器需要的包

    Spring定时器,也被称为Spring Task或者Spring Batch,是Spring框架的一部分,用于实现应用程序中的定时任务。这个压缩包包含了实现Spring定时任务所必需的所有组件。在Spring框架中,定时任务的处理主要依赖于`...

    Spring 定时器

    Spring 框架是 Java 开发中广泛使用的轻量级框架,它提供了众多功能,其中之一就是定时任务管理,也就是我们所说的“Spring 定时器”。这个功能使得开发者能够轻松地在应用中设置定时任务,无需依赖外部的定时服务,...

    java,javaweb,spring定时器

    综上所述,Java定时器在不同场景下有多种实现方式,包括Java基础库中的`Timer`和`ScheduledExecutorService`,以及在Java Web和Spring框架中的高级解决方案。选择哪种方式取决于具体的需求,如并发控制、任务粒度、...

    spring定时器3.0之前和3.0之后版本以及相应的项目实例

    Spring定时器是Spring框架中的一个核心特性,它允许开发者在应用程序中定义和管理定时任务。在Spring 3.0之前的版本和3.0之后的版本中,定时器的使用方式和功能有所变化,这些变化主要涉及到API的更新和功能增强。 ...

Global site tag (gtag.js) - Google Analytics