2010-05-31 11 views
6

Ich habe Task mithilfe von Spring @Scheduled-Annotation erstellt, aber aus irgendeinem Grund wird Task zweimal ausgeführt. Meine Spring Framework Version ist 3.0.2.Spring @Scheduled führt Task zweimal aus, wenn Anmerkungen verwendet werden

@Service 
public class ReportService { 

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

} 

Hier ist meine 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

Können Sie einige der relevanten Anwendungskontext oder eine andere solche Konfiguration einfügen? Gibt es vielleicht eine andere geplante Aufgabe, die diesen anruft? – jasonmp85

Antwort

0

Wo laufen Sie es wirklich? Dein PC? Einzelner Server? 2 x Last-ausgewogene App-Server?

Könnte sein, dass es auf (a) Ihrem PC und (b) auf Ihrem Server läuft, es sieht also so aus, als ob es zweimal läuft, wenn Sie sehen, was ich meine: Es läuft einmal genau an zwei verschiedenen Orten.

+0

Nur auf meiner Entwicklungsmaschine läuft ... es hat nur eine Laufzeit läuft ... Ich starte es von Eclipse ... – newbie

+0

Wird es auf einem App-Server auf Ihrem Computer, z. Tomcat, JBoss, Glassfish, auf welchen Sie aus Eclipse bereitstellen? Oder läuft es als eigenständige App? Eclipse lässt Sie möglicherweise eine zweite App laufen, während eine erste noch läuft. – Brian

+0

Der Eclipse Embedded Tomcat 6 Server. Und ich habe nur eine Instanz ausgeführt, ich habe es vom Task-Manager überprüft. – newbie

1

Nach diesem Beitrag: http://www.vodori.com/blog/spring3scheduler.html

Frühling 3.0.0 Veröffentlichung hatte einen Fehler, bei dem Web-Anwendungen mit einem Task-Scheduler würde geplant Methoden zweimal Ausführung beenden. Dies wurde in Feder 3.0.1 gelöst.

Es hat sich ein weiterer Fehler gemeldet worden, die Version/s wirkt sich: 3.0.2 https://jira.springsource.org/browse/SPR-7216

, die in Version/s festgelegt werden sollte: 3.0.3.

+2

läuft Ich habe das gleiche Problem und ich benutze Spring 3.1.1.Release – SiMet

-1

Eine Lösung, die ich vorschlagen würde, ist wie Komponente kv zu tun dieses

-In Anwendungskontext

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

In yourservlet-servlet.xml

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

ich auf diese Weise das Servlet nur, wenn der web.xml ähnliche geladen wird geladen wird für die Task

5

getan werden es

Entfernen Sie einfach

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

wegen Kontext Zuhörer geschieht aus web.xml sollte es funktionieren.

+1

warum es zweimal funktioniert zu Spring Scheduler? Ich entferne auch Context Listener, es hat nicht zweimal funktioniert. Aber ich möchte den Grund wissen. –

+0

ist es sicher, meinen 'ContextLoaderListener' aus web.xml zu entfernen? Damit das funktioniert – shareef

1

Ich hatte dieses Problem gerade erst und es wurde von meiner App verursacht, die zweimal in Tomcat durch Eclipse bereitgestellt wurde. Das Problem war, dass ich meine Anwendung in Eclipse umbenannt hatte, aber der in der Datei "org.eclipse.wst.common.component" .settings angegebene "wb-modul deploy-name" hatte immer noch den alten Namen.

Im Tomcat-Manager konnte ich sehen, dass ich 2 Apps mit unterschiedlichen Namen laufen hatte.

+0

Hatte das gleiche Problem, weil ich ROOT mit meinem App-Ordner verknüpft hatte und beide bereitgestellt wurden. – Zipper

2

Ich hatte das gleiche Problem, und ich fand schließlich heraus, dass das Problem als Folge der Bohnen in der root context sowie der servlet context erstellt wurde.

Um dies zu beheben, müssen Sie die Erstellung der Beans in den entsprechenden Kontexten trennen.

This answer erklärt sehr gut, wie das und war, was mein Problem behoben.

0

Überprüfen Sie, ob Sie eine manuelle Scheduler-Konfiguration in Ihren Konfigurationsdateien haben (über Java/XML). I'ved das gleiche Problem, und ich feststellen, dass mein Config zweimal meine Scheduler Klasse geladen wurde:

In Java:

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

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

In XML applicationContext.xml:

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

Und in meinem Scheduler-Klasse, ich hatte @Component-Annotation thats wurde durch die Komponente Scan und ein zweites Mal geladen, wodurch die @ Scheduler-Methoden zweimal ausgeführt. Ich habe die Java-Konfiguration entfernt und funktioniert jetzt gut!

0

Um zweimal Bearbeitung von @Scheduled Methode zu lösen einfach löschen ContextLoaderListener von Ihnen web.xml (wenn Sie web.xml-basierte Anwendung verwenden):

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

Oder wenn Sie WebApplicationInitializer verwenden -basierte Anwendung löschen Sie einfach eine Zeichenfolge, die Context fügt hinzu:

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

Verwendung @Scope (Wert = ConfigurableBeanFactory.SCOPE_ PROTOTYP) auf Ihrer Bean

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