2016-09-26 64 views
0

我有一個春季計劃任務運行每小時需要運行不重疊。 但是我遇到了一個問題,即任務啓動兩次,但在單獨的線程池中。春季計劃任務重疊在多個線程池

配置

@Configuration 
@EnableScheduling 
public class AppConfiguration implements SchedulingConfigurer { 

    // ... 

    @Bean(destroyMethod="shutdown") 
    public Executor taskExecutor() { 
     return Executors.newSingleThreadScheduledExecutor(); 
    } 

    @Override 
    public void configureTasks(final ScheduledTaskRegistrar scheduledTaskRegistrar) { 
     scheduledTaskRegistrar.setScheduler(taskExecutor()); 
    } 
} 

作業類

@Service 
public class JobClass { 

    @Scheduled(fixedDelay = 3600000) 
    public void doJob() { 
     LOG.debug("Start Task"); 
    } 
} 

日誌輸出

DEBUG 2016-09-26 15:49:08,874 [pool-2-thread-1][] JobClass - Start Task 
DEBUG 2016-09-26 15:49:10,249 [pool-1-thread-1][] JobClass - Start Task 

有什麼辦法強制只使用一個線程池?

回答

0

因此,第二天回來後,我能夠相對快速地弄清楚這一點。它最終成爲一個問題,我複製/粘貼從另一個應用程序的Web XML。

我的網站的XML包含以下:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5"> 

    <!-- Dispatcher Servlet --> 
    <servlet> 
     <servlet-name>dispatcher-servlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextClass</param-name> 
      <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> 
     </init-param> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>com.example.AppConfiguration</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>dispatcher-servlet</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

    <!-- Spring Context Loader --> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <context-param> 
     <param-name>contextClass</param-name> 
     <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> 
    </context-param> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>com.example.AppConfiguration</param-value> 
    </context-param> 

</web-app> 

所以發生了什麼,是執行人也沒有創造在多個池線程。我創建了兩個正在執行計劃任務的上下文。我能夠通過刪除Dispatcher Servlet配置的配置(我不需要這個應用程序)來解決這個問題。對於任何可能遇到需要調度程序servlet的同一問題的人,應該有兩個單獨的配置類,一個用於spring上下文,另一個用於servlet。

0

嘗試改變你的執行人是這樣的:

@Bean(destroyMethod="shutdown") 
public Executor taskExecutor() { 
    return Executors.newScheduledThreadPool(1); 
} 

我希望這將節省您的時間!

+0

從'newSingleThreadScheduledExecutor'的Executor文檔:「與其他等價的'newScheduledThreadPool(1)'不同,保證返回的執行程序不能重新配置爲使用其他線程。」所以結果是一樣的,除了我目前的代碼保證沒有額外的線程。在我自己的測試中,我已經嘗試過您的示例,以使其發揮作用並獲得相同的結果。 – kgengler