2017-02-16 34 views
0

單線程我在Spring MVC的一個應用。在控制器中,用戶可以運行進程(有按鈕)。進程工作一個小時(將其命名爲「longProces」)。 所以我想在其他線程中運行這個方法「longProces」。只運行在方法

當「longProces」正在運行時,其他用戶(當他想運行「longProces」時)應該得到消息:「此進程正在運行」並且他的線程被終止(不等待它轉向)。

我能做些什麼呢?任何想法?

謝謝解答

+0

,如果你提供一些代碼示例。但一般來說,你可以有某種標誌,這將是很高興,開啓時,過程開始運行上,當工藝要求的過程中開始你將檢查該標誌。另外,現在才結束關閉我建議把標誌測試和synchronized塊啓動過程中避免競爭條件 – urag

回答

0

可以使用的ExecutorService而不是執行者。

在執行器服務中提交任務並維護將來的引用在某些列表或映射中說。 ExecutorService threadExecutor = Executors.newSingleThreadExecutor(); Future future = threadExecutor.submit(new Task()); //submit the future in collection

你可以檢查已提交的任務每一個新的請求,但如果狀態completed-

//retrieve future instance from collection 
if(future.isDone()){ 
     //accept new request 
} 
else "process already running" 
+0

謝謝你回覆@Priya Singh。但是我應該在哪裏定義一個ExecuteService和Future?現在,當我定義Future類時,第二個線程等待他的時間,然後在第一個線程完成自己的工作時執行「longProces」。我想在第一次運行時「殺死」第二個線程 – damians

+0

您可以爲ExecutorService I.e創建一個單例bean。 TaskExecutor接口。您無需定義其由JDK提供的未來類。如果你有特定的要求,只有一個任務應該運行,那麼你可以保留Future的實例變量引用,或者如果你想針對一個用戶存儲一個任務,那麼你可以使用map來存儲它。我希望我能夠正確解釋它。 –

+0

是的,我明白你的意思:) – damians

0

這是一個基於設計的問題。

對於這種情況,我直截了當的解決方案是 - 在數據庫或任何其他持久層中保持這種較長的進程狀態,以便您可以爲每個請求首先執行邏輯檢查是否存在任何長進程處於活動狀態或不在持久狀態。基於這種情況,你可以決定你的流量。

更重要的一點是,持久層方法是用一個公共共享進程處理多個用戶請求的正確解決方案。

0

下面是我的狙擊代碼:

@RequestMapping("/generate") 
public String generate(HttpServletResponse response, Model model) throws Exception { 
    String communique; = "The process is launching"; 

    Runnable runnable =() -> { 
     try { 
      generatorService.runLongProces(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    }; 

    Executor tasExecutor = Executors.newSingleThreadExecutor(); 

    try{ 
    tasExecutor.execute(runnable); 

    } catch (Exception ex) 
    { 
    communique = "The process is failed"; 
    } 

    response.setStatus(HttpServletResponse.SC_ACCEPTED); 

    model.addAttribute("communique", communique); 

    return "institutions/download"; 
} 

,我想我在構造函數中設置一個線程。

也許我應該爲Spring TaskExecutor創建一個單例bean?