2016-10-21 58 views
1

我試圖爲我的彈簧應用程序創建一個lib。它有一個預定的工作,它是自動配置的,並且在大多數情況下作爲包含Maven依賴的工作。如果作業還沒完成,彈簧調度程序不能運行

我有一個Web應用程序,基本上只是氾濫請求到其他webapps(一些基本的負載測試和失敗檢測)。請求者實現完全異步(它也有一個手動配置的異步執行程序)。網絡應用程序也有定期工作,但它不能在2分鐘內完成它的工作。它仍然很好。但。

當我開始在第二臺描述的服務器上使用我首先描述的lib時,lib開始工作不可靠。它不再每2分鐘觸發一次。我沒有足夠的知識來了解原因。

我最好的選擇是服務器洪水方法啓動了大量的異步任務,調度程序也啓動這些任務,並且這些請求將進入相同的消息隊列。

是否有任何方法將我的庫計劃任務從其他服務器計劃任務中分離出來並使其每2分鐘運行一次?

+0

您可以共享代碼,以瞭解如何配置您的任務執行和調度程序相關配置 您可能想看看這個,如果有幫助http://stackoverflow.com/a/21409068/3838328 – Kamal

+0

我現在遠離我的代碼,但它是一個springboot應用程序。我認爲如果我可以在我的lib中定義一個分離的Executor就足夠了。我認爲[這](http://stackoverflow.com/questions/32207023/multiple-threadpooltaskexecuters-spring-java-config)將解決我的問題,但我不知道,現在不能嘗試,也許明天:) – tg44

回答

0

所以我的研究很有趣...似乎是,只有配置異步執行程序纔會強制調度程序也使用它。但是,如果您也實現了schedulerConfigurer,則只會獲得專用於計劃任務的另一個線程池。

所以我的實現是這樣的單獨的2線程池。

@SpringBootApplication 
@EnableAsync 
@EnableScheduling 
@ComponentScan 
public class WebService extends AsyncConfigurerSupport implements SchedulingConfigurer { 
public static void main(String[] args) { 
    System.setProperty("http.proxyHost", "localhost"); 
    System.setProperty("http.proxyPort", "8888"); 
    System.setProperty("spring.config.name", "web-server"); 
    SpringApplication.run(WebService.class, args); 
} 
@Override 
public Executor getAsyncExecutor() { 
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
    executor.setCorePoolSize(2); 
    executor.setMaxPoolSize(4); 
    executor.setQueueCapacity(500); 
    executor.setThreadNamePrefix("tester-"); 
    executor.initialize(); 
    return executor; 
} 
@Bean(destroyMethod = "shutdown", name = "scheduledExecutor") 
public Executor taskExecutor() { 
    return Executors.newScheduledThreadPool(100); 
} 

@Autowired 
@Qualifier(value="scheduledExecutor") 
Executor scheduledExecutor; 

@Override 
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { 
    taskRegistrar.setScheduler(scheduledExecutor); 
} 

如果我可以爲我的lib創建一個單獨的線程池,但是現在還不夠好,還是不夠清楚。

相關問題