2010-05-31 14 views
6

Wykonałem zadanie za pomocą adnotacji Spring @Sulowany, ale z jakiegoś powodu wykonuje ono dwukrotnie zadanie. Moja wersja Spring Framework to 3.0.2.Spring @Scheduled wykonuje zadanie dwa razy podczas korzystania z adnotacji

@Service 
public class ReportService { 

    @Scheduled(fixedDelay=1000 * 60 * 60* 24) 
    @Transactional 
    public void dailyReportTask() 
    { 
     ... code here ... 
    } 

} 

Tu jest mój XML:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    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.xsd 
http://www.springframework.org/schema/task 
http://www.springframework.org/schema/task/spring-task-3.0.xsd"> 
    <task:scheduler id="taskScheduler" /> 
    <task:executor id="taskExecutor" pool-size="1" /> 
    <task:annotation-driven executor="taskExecutor" 
     scheduler="taskScheduler" /> 
</beans> 
+0

Czy możesz wkleić część odpowiedniego kontekstu aplikacji lub inną taką konfigurację? Czy jest możliwe inne zaplanowane zadanie, które nazywa się tym? – jasonmp85

Odpowiedz

0

Gdzie są rzeczywiście działa to? Twój komputer? Pojedynczy serwer? 2 x serwery aplikacji równoważące obciążenie?

Możliwe, że działa na (a) komputerze i (b) serwerze, więc wygląda na to, że działa dwa razy, jeśli widzisz co mam na myśli: działa poprawnie, tylko w dwóch różnych lokalizacjach.

+0

Po uruchomieniu na mojej maszynie programistycznej ... działa tylko jedna istota ... Uruchomiłem ją od zaćmienia ... – newbie

+0

Czy działa na serwerze aplikacji na komputerze, np. Tomcat, JBoss, Glassfish, do którego wdrożyłeś Eclipse? A może działa jako samodzielna aplikacja? Eclipse może pozwolić Ci uruchomić drugą aplikację, podczas gdy pierwsza nadal działa. – Brian

+0

Jego serwer Eclipse embedded tomcat 6. I mam tylko jedną instancję, sprawdziłem to od menedżera zadań. – newbie

1

Według tego postu: http://www.vodori.com/blog/spring3scheduler.html

Wiosna 3.0.0 Release miał błąd, aplikacji internetowych z harmonogramu zadań będzie skończyć wykonywanie zaplanowanych metod dwukrotnie. Zostało to rozwiązane w wersji Spring 3.0.1.

Nastąpił kolejny bug zgłaszane co wpływa Version/S: 3.0.2 https://jira.springsource.org/browse/SPR-7216

które powinny zostać poprawione w wersji/s: 3.0.3.

+2

Mam ten sam problem i używam Spring 3.1.1.Release – SiMet

-1

Jedno rozwiązanie proponuję to zrobić komponentu scat jak ten

-W kontekście aplikacji

<context:component-scan base-package="com.abc.cde.dao" /> 

W yourservlet-servlet.xml

<!-- package that had all the @Controller classes --> 

I w ten sposób aplet jest ładowany tylko wtedy, gdy jest załadowana web.xml Podobne można zrobić za zadanie

5

dzieje się to z powodu kontekstowego słuchacza

Wystarczy usunąć

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

od web.xml to powinno działać.

+1

, dlaczego działa dwa razy do Spring Scheduler? Usuwam także kontekstowy program nasłuchujący, nie działał dwa razy. Ale chcę znać przyczynę. –

+0

jest bezpieczne, aby usunąć moje 'ContextLoaderListener' z web.xml? aby to działało – shareef

1

Po prostu miałem ostatnio ten problem i było to spowodowane przez dwukrotne rozmieszczenie mojej aplikacji w serwerze Tomcat w wyniku zaćmienia. Problem polegał na tym, że zmieniłem nazwę mojej aplikacji w eclipse, ale "nazwa-wdrożenia modułu-wb" określona w "org.eclipse.wst.common.component" .setset wciąż miał starą nazwę.

W menedżerze tomcat widziałem, że miałem uruchomione 2 aplikacje o różnych nazwach.

+0

Miałem ten sam problem, ponieważ miałem dowiązanie symboliczne do folderu ROOT i oba zostały wdrożone. – Zipper

2

Miałem ten sam problem iw końcu dowiodłem, że problem wystąpił w wyniku utworzenia fasoli w root context, a także servlet context.

Tak więc, aby rozwiązać ten problem, trzeba oddzielić tworzenie ziaren w odpowiednich kontekstach.

This answer wyjaśnia się naprawdę dobrze, jak to było i co stały mój problem.

0

Sprawdź, czy masz jakąkolwiek ręczną konfigurację harmonogramu w plikach konfiguracyjnych (przez Java/XML). I'ved ten sam problem, i odkrywam, że mój config ładował moją klasę planującego dwukrotnie:

W Javie:

package com.mywork.br.myschuedulerpackage; 
{...} 
@Configuration 
@EnableScheduling 
public class SchedulerConfiguration { 

    @Bean 
    public CTXDataImporterScheduler ctxDataImporterScheduler() { 
     return new CTXDataImporterScheduler(); 
    } 
} 

W XML applicationContext.xml:

<context:component-scan base-package="com.mywork.br.myschuedulerpackage" /> 

i moim klasa programu planującego, miałem adnotację @Component, która była przechwytywana przez skanowanie składnika i ładowana po raz drugi powodując dwukrotne wykonanie metod @scheduler. Usunąłem konfigurację Java, a teraz działa dobrze!

0

Aby rozwiązać dwa razy funkcjonowanie @Scheduled metody po prostu usunąć ContextLoaderListener od ciebie web.xml (jeśli używasz aplikacji web.xml-based): Jeśli używasz WebApplicationInitializer opartych

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

Albo aplikacja po prostu usunąć ciąg, który dodaje ContextLoaderListener:

package com.dropbox.shortener.config; 

import org.springframework.web.WebApplicationInitializer; 
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; 
import org.springframework.web.filter.CharacterEncodingFilter; 
import org.springframework.web.servlet.DispatcherServlet; 
import javax.servlet.FilterRegistration; 
import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRegistration; 

public class DropboxShortenerWebApplicationInitializer implements WebApplicationInitializer { 

    @Override 
    public void onStartup(ServletContext container) throws ServletException { 
     AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); 
     rootContext.register(AppConfig.class); 

     // (!) Delete the next string 
     // container.addListener(new ContextLoaderListener(rootContext)); 

     AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext(); 
     dispatcherContext.register(WebConfig.class); 

     ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext)); 
     dispatcher.setLoadOnStartup(1); 
     dispatcher.addMapping("/"); 

     setupCharEncodingFilter(container); 
    } 

    private void setupCharEncodingFilter(ServletContext container) { 
     container.setInitParameter("defaultHtmlEscape", "true"); 

     FilterRegistration charEncodingFilterReg = container.addFilter("CharacterEncodingFilter", CharacterEncodingFilter.class); 
     charEncodingFilterReg.setInitParameter("encoding", "UTF-8"); 
     charEncodingFilterReg.setInitParameter("forceEncoding", "true"); 
     charEncodingFilterReg.addMappingForUrlPatterns(null, false, "/*"); 
    } 
} 
0

zastosowanie @Scope (wartość = ConfigurableBeanFactory.SCOPE_ PROTOTYPE) na twojej fasoli

0
Disabling below will work. 
<!-- <listener> 
    <listener-class> 
     org.springframework.web.context.ContextLoaderListener 
    </listener-class> 
</listener> --> 
Powiązane problemy