2010-08-25 11 views
15

Estoy configurando un esquema de tareas programadas en la primavera, utilizando el espacio de nombres de la tarea.Programación de tareas para ejecutar una vez, utilizando el espacio de nombres de la tarea de resorte

quiero programar la mayoría de las tareas de fuego según una expresión cron, y otros para disparar una sola vez, un retardo fijo después del inicio, y luego nunca más (es decir, el establecimiento de lo que repeatCount a 0 en un SimpleTriggerBean lograría).

¿Es posible lograr esto dentro del espacio de nombres de la tarea, o necesito volver a definir los beans para mis disparadores?

Respuesta

7

Si usted tiene un vistazo a la Task namespace XSD, podrás ver que sólo hay tres diferentes tipos de configuración: fixed-delay, y fixed-ratecron.

Y si mira la fuente de ScheduledTasksBeanDefinitionParser, verá que no se evalúan más de uno de estos valores. Aquí está la parte pertinente:

String cronAttribute = taskElement.getAttribute("cron"); 
if (StringUtils.hasText(cronAttribute)) { 
    cronTaskMap.put(runnableBeanRef, cronAttribute); 
} 
else { 
    String fixedDelayAttribute = taskElement.getAttribute("fixed-delay"); 
    if (StringUtils.hasText(fixedDelayAttribute)) { 
     fixedDelayTaskMap.put(runnableBeanRef, fixedDelayAttribute); 
    } 
    else { 
     String fixedRateAttribute = taskElement.getAttribute("fixed-rate"); 
     if (!StringUtils.hasText(fixedRateAttribute)) { 
      parserContext.getReaderContext().error(
        "One of 'cron', 'fixed-delay', or 'fixed-rate' is required", 
        taskElement); 
      // Continue with the possible next task element 
      continue; 
     } 
     fixedRateTaskMap.put(runnableBeanRef, fixedRateAttribute); 
    } 
} 

lo que no hay manera de combinar estos atributos. En resumen: el espacio de nombres no te llevará allí.

13

Mi ejemplo de trabajo:

<bean id="whateverTriggerAtStartupTime" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> 
    <property name="jobDetail" ref="whateverJob"/> 
    <property name="repeatCount" value="0"/> 
    <property name="repeatInterval" value="10"/> 
</bean> 
3

Esto funciona y es mucho más fácil que las otras respuestas.

// Will fire the trigger 1 + repeatCount number of times, start delay is in milliseconds 
    simple name: 'mySimpleTrigger', startDelay: 5000, repeatCount: 0 
+1

¿Cuál es la sintaxis? –

15

Si no es necesario un retraso inicial, se puede hacer que se ejecute 'una sola vez' en el inicio de la siguiente manera:

<task:scheduled-tasks> 
    <!-- Long.MAX_VALUE ms = 3E8 years; will run on startup 
        and not run again for 3E8 years --> 
    <task:scheduled ref="myThing" method="doStuff" 
       fixed-rate="#{ T(java.lang.Long).MAX_VALUE }" /> 
</task:scheduled-tasks> 

(Por supuesto, si considera que su código se va a se ejecuta durante más tiempo que 3E8 years, es posible que necesite un enfoque diferente ...)

Si necesita un retraso inicial, puede configurarlo de la siguiente manera (estoy probando con Spring 3.1.1) - esto no requiere cualquier dependencia adicional y no tienes que escribir tu propio disparador, pero tienes que configurar el PeriodicTrigger proporcionada por el resorte:

<bean id="onstart" class="org.springframework.scheduling.support.PeriodicTrigger" > 
    <!-- Long.MAX_VALUE ms = 3E8 years; will run 5s after startup and 
       not run again for 3E8 years --> 
    <constructor-arg name="period" value="#{ T(java.lang.Long).MAX_VALUE }" /> 
    <property name="initialDelay" value="5000" /> 
</bean> 
<task:scheduled-tasks> 
    <task:scheduled ref="myThing" method="doStuff" trigger="onstart" /> 
</task:scheduled-tasks> 

Primavera 3.2 parece apoyar la "inicial de retardo" atribuir directamente, pero no han probado este; Supongo que esto funciona:

<task:scheduled-tasks> 
    <task:scheduled ref="myThing" method="doStuff" 
         fixed-rate="#{ T(java.lang.Long).MAX_VALUE }" 
         initial-delay="5000"/> 
</task:scheduled-tasks> 
Cuestiones relacionadas