2010-05-31 159 views
6

我已經使用Spring @Scheduled註釋創建了任務,但由於某種原因它正在執行兩次任務。我的Spring Framework版本是3.0.2。Spring @Scheduled在使用註釋時執行兩次任務

@Service 
public class ReportService { 

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

} 

這裏是我的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

你可以粘貼一些相關的應用程序上下文或其他這樣的配置嗎?有沒有可能是另一個調用這個的計劃任務? – jasonmp85 2010-05-31 10:37:40

回答

0

你在哪裏實際運行呢?你的電腦?單個服務器? 2個負載均衡的應用程序服務器?

它可以運行在(a)你的電腦和(b)你的服務器上,所以它看起來像運行兩次,如果你看到我的意思:它正確運行一次,只是在兩個不同的位置。

+0

只在我的開發機器上運行...它只有一個運行...我從eclipse運行它... – newbie 2010-05-31 10:52:36

+0

它是否運行在您的機器上的應用程序服務器上,例如:您從Eclipse部署的Tomcat,JBoss,Glassfish?或者它是作爲一個獨立的應用程序運行? Eclipse可能讓你運行第二個應用程序,而第一個應用程序仍然在運行。 – Brian 2010-05-31 14:04:30

+0

其Eclipse嵌入式tomcat 6服務器。而且我只有一個實例在運行,我從任務管理器中檢查過它。 – newbie 2010-06-01 13:42:08

-1

一個解決方案,我建議是做組件SCAT這樣

- 在應用程序上下文

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

在yourservlet-servlet.xml中

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

我這樣,如果在web.xml加載 類似這個servlet只能夠裝載任務完成

5

那是因爲上下文偵聽的發生

剛剛從刪除

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

web.xml它應該工作。

+1

爲什麼它工作兩次到Spring Scheduler?我也刪除上下文監聽器,它沒有工作兩次。但我想知道原因。 – 2016-09-04 06:06:40

+0

從web.xml中刪除我的ContextLoaderListener是否安全?使這項工作 – shareef 2017-07-01 07:30:37

1

我剛剛有這個問題,這是由於我的應用程序在eclipse中部署了兩次Tomcat。問題在於我在eclipse中重命名了我的應用程序,但在「org.eclipse.wst.common.component」.settings文件中指定的「wb-module deploy-name」仍舊具有舊名稱。

在tomcat管理器中,我可以看到我有兩個以不同名稱運行的應用程序。

+0

有相同的問題,因爲我已經將符號鏈接到我的應用程序文件夾,並且都被部署。 – Zipper 2014-08-05 23:22:46

2

我有這個相同的問題,我最終發現問題是由於在root context以及servlet context中創建的bean而發生的。

因此,要解決這個問題,您需要將bean的創建分離到適當的上下文中。

This answer很好的解釋瞭如何解決問題。

0

檢查您的配置文件(通過Java/XML)是否有任何手動調度程序配置。 I'ved同樣的問題,我發現,我的配置是我的加載類調度兩次:

在Java:

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

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

在XML中的applicationContext.xml:

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

在我調度程序類,我有@Component註釋這是由組件掃描捕獲和第二次加載導致@scheduler方法執行兩次。 我刪除了Java配置,然後現在運行良好!

0

爲了解決@Scheduled方法的兩次工作從您剛刪除ContextLoaderListener的web.xml(如果你使用的web.xml的應用程序):如果你使用基於WebApplicationInitializer

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

或者應用程序只是刪除路線,增加的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

使用@Scope(值= ConfigurableBeanFactory.SCOPE_ PROTOTYPE)

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