2010-01-17 20 views
13

Tengo una aplicación simple que usa Spring 3 para la inyección de dependencias. Tengo un JFrame para que el usuario lo vea y algunas tareas en segundo plano para sincronizar con un servidor de back-end y el mantenimiento de la base de datos local.Tarea de retardo: primera ejecución del planificador en Spring 3

Esta es la parte relevante de mi contexto de aplicación:

<task:scheduler id="scheduler" pool-size="1"/> 
<task:scheduled-tasks scheduler="scheduler"> 
    <task:scheduled ref="synchronizer" method="incrementalSync" fixed-delay="600000"/> 
    ... more tasks ... 
</task:scheduled-tasks> 

<bean id="mainFrame" class="nl.gdries.myapp.client.ui.MainFrame"> 
    ... properties and such ... 
</bean> 

Cuando inicio esta applicationContext el planificador se inicia inmediatamente la ejecución de las tareas en segundo plano, incluso mientras se está cargando mi interfaz de usuario. Como la primera tarea es bastante pesada al principio, quiero que espere a que la UI se cargue y muestre por completo antes de que comience la ejecución.

¿Alguien sabe cómo decirle a Spring que demore la ejecución de las tareas programadas hasta el momento que elija?

Respuesta

8

Esto parece haberse quedado fuera de la definición del grano <task:scheduled>, algo que acabo de notar la semana pasada.

Recuerde, sin embargo, que las definiciones <task:...> son solo accesos directos, siempre puede utilizar el enfoque explícito, definiendo un ScheduledExecutorFactoryBean, con beans anidados ScheduledExecutorTask. Esto le da un control mucho más fino, incluido initialDelay.

5

que he tenido el mismo problema y volvió a TimerTask como lo es en el punto 25.7.1 de http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/scheduling.html

<bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"> 
    <!-- wait 25 seconds before starting repeated execution --> 
    <property name="delay" value="25000" /> 
    <!-- run every 50 seconds --> 
    <property name="period" value="50000" /> 
    <property name="timerTask" ref="task" /> 
</bean> 

<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean"> 
    <property name="scheduledTimerTasks"> 
     <list> 
      <ref bean="scheduledTask" /> 
     </list> 
    </property> 
</bean> 

espero en la primavera de 3,1 será atributo initialDelay en <task:scheduled>, ya que en la primavera 3,0 TimerFactoryBean es obsoleto. Se puede votar para este problema: jira.springframework.org/browse/SPR-7022

+0

es posible tener Paramete cron dinámico r para cada tarea? usando TimeFactoryBean ?? –

3

Esto ha sido introducido por la forma en la primavera 3.2 por lo que si se utiliza el esquema de 3,2 vuelva a estar disponible - por ejemplo:

<?xml version="1.0"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd 
     http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd"> 

....

lo anterior le permite hacer esto:

<task:scheduler id="scheduler" pool-size="1"/> 
<task:scheduled-tasks scheduler="scheduler"> 
    <task:scheduled ref="synchronizer" method="incrementalSync" fixed-delay="600000" initial-delay="initial delay needed for the app to start"/> 
    ... more tasks ... 
</task:scheduled-tasks>