2010-04-08 12 views
93

Podczas korzystania z możliwości Wiosna 3,0 do opisywania zaplanowanego zadania, chciałbym ustawić fixedDelay jako parametr z mojego pliku konfiguracyjnym, zamiast ciężko podłączać je do mojej klasy zadania, jak obecnie ...Jak sparametryzować @Scheduled (fixedDelay) przy użyciu języka wyrażeń Spring 3.0?

@Scheduled(fixedDelay = 5000) 
public void readLog() { 
     ... 
} 

Niestety wydaje się, że przy pomocy języka Expression Spring (Spel) @Value zwraca obiekt String, który z kolei nie może być automatycznie zapakowany do długiej wartości wymaganej przez parametr fixedDelay.

Odpowiedz

26

Chyba @Scheduled adnotacja jest wykluczone. Być może rozwiązaniem dla Ciebie byłaby konfiguracja XML task-scheduled. Rozważmy ten przykład (skopiowany z Spring doc):

<task:scheduled-tasks scheduler="myScheduler"> 
    <task:scheduled ref="someObject" method="readLog" 
       fixed-rate="#{YourConfigurationBean.stringValue}"/> 
</task:scheduled-tasks> 

... czy obsada z String do Longa nie działa, coś jak to będzie:

<task:scheduled-tasks scheduler="myScheduler"> 
    <task:scheduled ref="someObject" method="readLog" 
      fixed-rate="#{T(java.lang.Long).valueOf(YourConfigurationBean.stringValue)}"/> 
</task:scheduled-tasks> 

Znowu haven” t próbowałem żadnej z tych konfiguracji, ale mam nadzieję, że może ci to trochę pomóc.

+0

Dzięki, konfiguracja XML zrobiła lewy. Jestem nieco zaskoczony, że adnotacja wydaje się być tak związana z wartościami ciągów, tak czy inaczej, idę ze staromodną drogą ;-) – ngeek

+1

Czy istnieje odpowiednik Javy dla powyższej konfiguracji? – amique

+0

@Grzegorz Oledzki jaka będzie wartość "someObject" w tagu . Jeśli kontroler ma więcej niż jedną metodę, która wymaga stałego opóźnienia i początkowego opóźnienia, to w jaki sposób będzie to obsługiwane? – Moitt

0

Sądzę, że możesz sam przekonwertować wartość, definiując komponent bean. nie próbowałem, że, ale myślę, że podejście podobny do następującego może być przydatne dla Ciebie:

<bean id="FixedDelayLongValue" class="java.lang.Long" 
     factory-method="valueOf"> 
    <constructor-arg value="#{YourConfigurationBean.stringValue}"/> 
</bean> 

gdzie:

<bean id="YourConfigurationBean" class="..."> 
     <property name="stringValue" value="5000"/> 
</bean> 
+0

Dzięki, że brzmi jak jeden sposób, ale szczerze mówiąc liczyłem na bardziej elegancki („springish”) roztworu :-) – ngeek

+1

Niestety to nie będzie działać, ponieważ @Scheduled adnotacji przypisują fixedDelay wymaga (long) stała do przypisania. – ngeek

+0

Ach, zgadza się. Myślę więc, że nie można tego zrobić za pomocą adnotacji "@ Scheduled". –

43

Można użyć @Scheduled adnotacji, ale tylko razem z parametrem cron:

@Scheduled(cron = "${yourConfiguration.cronExpression}") 

Twój przedział 5 sekund może być wyrażona jako "*/5 * * * * *". Jednak, jak rozumiem, nie można zapewnić dokładności mniejszej niż 1 sekunda.

+7

Wyrażone wyrażenie cron jest równoważne określeniu fixedRate, które różni się od fixedDelay – codebox

305

Spring v3.2.2 dodał parametry String do oryginalnych 3 długich parametrów, aby obsłużyć to. , fixedRateString i initialDelayString są już dostępne.

@Scheduled(fixedDelayString = "${my.fixed.delay.prop}") 
public void readLog() { 
     ... 
} 
+0

. Dlaczego ta opcja nie jest oznaczona jako odpowiednia? – Avi

+0

@Avi Ta odpowiedź pojawia się trzy lata po pytaniu PO. W momencie pytania (i zaakceptowanej odpowiedzi) ta funkcja nie istniała. – medveshonok117

+0

@ medveshonok117 Rozumiem. Dzięki – Avi

Powiązane problemy