`

试下Spring的scheduledTask: 不应该出问题的问题

阅读更多

        要用Spring的scheduledTask了, 于是先在eclipse里做了小试验,试下.本来很简单的一个功能,不论是spring的文档还是网上都有可以参考的小例子, 但一试,发现有问题了. 一是配置的那个scheduledTask没有运行, 后来用一个很笨的方法运行了, 但时间明显不对.

下面是运行程序的main方法:

     public static void main(String[] args) throws InterruptedException {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        int i=0;
        while(i< 10) {
            Thread.sleep(1000);
            System.out.println("..."+i++);
        }
        if("run".equals(args[0])) {
            System.out.println("timerFactory: "+context.getBean("timerFactory"));
        }      
    }

    那 个很笨的方法是通过启动参数来运行,也就是若以这样的方式(java -jar springScheduler.jar run)来运行时,那个scheduledTask就可以起作用了. 若不加run,而以"java -jar springScheduler.jar"来运行的话, scheduledTask就不起作用?

    不应该呀!

下面是applicationContext.xml里的配置:

     <bean id="checkEmail" class="spring.MyTimerTask"/>
   
    <bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
       
        <property name="delay" value="0" />
       
        <property name="period" value="5" />
        <property name="timerTask" ref="checkEmail" />
    </bean>
   
    <bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
        <property name="scheduledTimerTasks">
            <list>
                <!-- see the example above -->
                <ref bean="scheduledTask" />
            </list>
        </property>
        <!--<property name="daemon" value="true"/>--> 
    </bean>

    觉得原因是Spring在初始化context时没有初始化timerFactory,这样若不通过context来getBean ("timerFactory")的话, 这个实例就不会初始化, 总觉得不应该这样的.一般一个scheduledTask的运行用户是不会有干涉的, 所以也不必为了让这个timerFactory初始化而特意get下bean.

    考虑到这个原因后<beans>的属性里加上了default-lazy-init="false",但还是不行, 如下所示:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
       default-lazy-init="false">

    这是为什么? 怎么解决? 从网上搜了很多这方面的材料但都没提到这个问题, 我为什么一到我这就出问题了呢?

    再说第二个问题: 时间明显不对.

为了明显点, 我特意把每执行一次的时间改为5ms, 如下所示:
          <property name="delay" value="0" />       
        <property name="period" value="5" />
        这样不用等待就立即执行,但当用"java -jar springScheduler.jar run"方式启动后,运行的很慢,我的电脑不至于那么慢吧?


        这里面又有什么隐情? 中邪了???

 

----------------------------------------------------------------------------

下载这里的jar包,可能运行"java -jar springScheduler.jar run"(或不带run参数)来试试.

 

2
0
分享到:
评论
2 楼 rmn190 2008-11-22  
在timerFactory的配置里加了lazy-init="false"就可以了,

但别人怎么没遇到这个问题呢, 在网上也没搜到这方面的说明.

1 楼 fujohnwang 2008-11-22  
1-

     public static void main(String[] args) throws InterruptedException {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        context.getBean("timerFactory");     
    }


2- timer is legacy now,it's single-threaed, so if your task takes a long time to run, later ones will be delayed.  try to use quartz or DelayedQueue in Java5 or other solutions.

相关推荐

    Spring定时任务@Scheduled例子

    `task:executor`则是Spring中用于处理异步任务的bean,它可以被`@Async`和`@Scheduled`注解的方法使用。配置`task:executor`可以定制线程池属性,如核心线程数、最大线程数、线程存活时间等。 5. **测试说明** 在...

    spring-boot-scheduled-task.zip

    这个名为"spring-boot-scheduled-task.zip"的压缩包很可能包含了一个完整的Spring Boot项目,用于演示或实践如何配置和使用Spring Boot的定时任务功能。在这个项目中,我们可以预期看到以下几个关键知识点: 1. **...

    使用Spring Task开发定时任务的Demo

    Spring Task提供了两种主要的方式来创建定时任务:`@Scheduled`注解和`TaskScheduler`接口。`@Scheduled`注解可以用于方法上,用于声明一个定时任务,而`TaskScheduler`接口则允许自定义任务调度逻辑。 ```java // ...

    spring定时任务关键jar包(齐全)

    在Java开发中,Spring框架是不可或缺的一部分,尤其在企业级应用中,它的各种特性使得开发者能够构建健壮、可维护的系统。其中,Spring的定时任务功能是许多项目中的重要组成部分,它允许开发者安排和执行周期性的...

    使用spring @Scheduled注解执行定时任务

    需要注意的是,定时任务方法不能有返回值,否则Spring会在启动时抛出异常。 #### 四、常见问题及注意事项 **4.1 方法无返回值** 如前文所述,定时任务方法不能有返回值。如果需要返回值,则需要设置代理模式为...

    spring自带定时任务程序

    这个文档应该详细介绍了每个步骤,包括如何在Spring环境中注册和启动定时任务,如何编写带有`@Scheduled`注解的方法,以及如何编写测试用例来验证定时任务的正确性。 6. **应用实践**: Spring的定时任务功能在...

    spring定时任务依赖的jar包

    在Spring中,我们可以使用Spring的TaskExecution和TaskScheduling模块来实现定时任务,这些功能通常依赖于特定的jar包。以下是对标题和描述中涉及的知识点的详细解释: 1. **Spring Task模块**:这是Spring提供的一...

    IntelliJ IDEA中创建Spring boot项目,定时任务测试

    2. **编写定时任务类**:在Java源码目录下创建一个定时任务类,例如`ScheduledTask.java`,并使用`@Component`注解标记为Spring Bean。然后使用`@Scheduled`注解来定义任务的执行周期,如`cron`表达式控制执行频率。...

    IDEA使用springboot自带scheduled实现任务调度

    在Java开发领域,Spring Boot框架以其便捷的特性深受开发者喜爱,而Spring Boot集成的Scheduled功能则为开发者提供了定时任务调度的能力。本篇文章将详细介绍如何在IDEA中利用Spring Boot的Scheduled来实现任务调度...

    spring定时器

    对于不使用Java配置的情况,可以在Spring的XML配置文件中定义一个`&lt;task:scheduled-tasks&gt;`元素,然后在其内部配置多个`&lt;task:scheduled&gt;`元素来定义定时任务。 ```xml &lt;beans xmlns="http://...

    spring开发参考手册

    - **Spring Task**:内置的定时任务框架,可以使用@Scheduled注解或TaskScheduler接口实现。 11. **WebSocket支持**: - **WebSocket API**:Spring提供WebSocket服务器端和客户端的实现,支持STOMP协议。 12. *...

    spring定时器demo

    &lt;task:scheduled ref="scheduledTasks" method="reportCurrentTime" fixed-rate="5000"/&gt; &lt;/task:scheduled-tasks&gt; &lt;bean id="scheduledTasks" class="com.example.ScheduledTasks"/&gt; ``` 这里,`ref`属性指定...

    spring 定时任务@Scheduled详解

    在Spring框架中,定时任务是通过`@Scheduled`注解实现的,该注解提供了灵活的方式来安排任务在特定时间执行。下面将详细讲解如何配置和使用`@Scheduled`,以及其相关的cron表达式。 首先,要启用Spring的定时任务...

    spring配置定时

    1. **基于XML配置**:这通常涉及在配置文件(如`spring-quartz-task.xml`)中定义`&lt;task:scheduled-tasks&gt;`和`&lt;task:scheduled&gt;`元素。例如,你可以为一个方法指定cron表达式,这个方法将在指定的时间间隔内自动执行...

    spring定时器简单实例

    Spring定时器,也被称为Spring Boot的定时任务,是Spring框架中的一个强大功能,它允许开发者在特定的时间间隔执行任务,而无需手动管理线程。在实际的开发中,这一特性常用于实现数据清理、统计计算、发送邮件等...

    task-scheduling:使用 Spring Boot 以编程方式调度任务

    在 IT 领域,任务调度是不可或缺的一部分,特别是在企业级应用中,它允许系统自动执行计划的任务,如数据同步、报表生成等。本篇文章将深入探讨如何在 Spring Boot 应用中使用 Spring 的 TaskScheduler 实现编程式...

    Spring定时器与动态代理实例

    在Java开发领域,Spring框架是不可或缺的一部分,它提供了一种强大的、灵活的方式来组织和管理应用程序。在Spring中,定时任务的实现通常通过Spring Task模块,也就是我们常说的Spring定时器。这个实例将深入探讨...

    Spring 3.2.0 API_CHM

    6. **任务调度与执行**:Spring的Task模块支持定时任务和后台任务的执行,如使用@Scheduled注解进行定时任务的定义。 7. **测试支持**:Spring提供了一套完整的测试框架,包括单元测试、集成测试和端到端测试,支持...

    spring定时任务注解实现

    在Spring框架中,定时任务是应用中不可或缺的一部分,它允许我们按照预定的时间间隔执行特定的任务。本篇文章将详细探讨如何使用Spring的注解来实现定时任务,以及在实际开发中的应用。 首先,我们要引入Spring的...

Global site tag (gtag.js) - Google Analytics