2010-01-17 9 views
13

Ich habe eine einfache Anwendung, die Spring 3 für die Abhängigkeits-Injektion verwendet. Ich habe einen JFrame für den Benutzer und einige Hintergrundaufgaben für die Synchronisierung mit einem Back-End-Server und die lokale Datenbankwartung.Verzögerung Aufgabe: Scheduler erste Ausführung im Frühjahr 3

Dies ist der relevante Teil meiner Anwendungskontext:

<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> 

Wenn ich beginnen diese den Scheduler sofort Application beginnt, die Hintergrundaufgaben ausführt, selbst wenn meine UI geladen ist. Da die erste Aufgabe zu Beginn sehr umfangreich ist, möchte ich darauf warten, dass die Benutzeroberfläche vollständig geladen und angezeigt wird, bevor sie ausgeführt wird.

Kann jemand Spring die Ausführung der geplanten Aufgaben bis zu einem Moment meiner Wahl verzögern?

Antwort

8

Dies scheint aus der <task:scheduled> Bean-Definition, etwas, das ich gerade erst letzte Woche bemerkt habe.

Denken Sie daran, dass die Definitionen nur Abkürzungen sind, können Sie immer den expliziten Ansatz verwenden, indem Sie eine ScheduledExecutorFactoryBean mit verschachtelten ScheduledExecutorTask Beans definieren. Dies gibt Ihnen viel feinere Kontrolle, einschließlich initialDelay.

5

Ich habe das gleiche Problem und kam zurück, um Timertask hat, wie es in <task:scheduled> initialDelay Attribut in 25.7.1 Punkt in 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> 

Ich hoffe, im Frühjahr 3.1 sein, da im Frühjahr 3.0 TimerFactoryBean ist, wird ist veraltet. Sie können für dieses Thema abstimmen: jira.springframework.org/browse/SPR-7022

+0

ist es möglich, dynamische cron paramete haben Für jede Aufgabe? mit TimeFactoryBean ?? –

3

Dies wird durch die Art und Weise in Frühjahr eingeführt wurde 3,2 so, wenn Sie das 3.2-Schema verwenden es wieder verfügbar ist - zB:

<?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"> 

....

die oben ermöglicht es Ihnen, dies zu tun:

<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> 
Verwandte Themen