2011-07-21 19 views
0

我完全不熟悉Spring框架(以及大多數Web開發),但我試圖將一些沉重的Java後端代碼連接到新的Spring和JSP項目。我的控制器的handleRequest()在它返回我的request.jsp ModelAndView對象之前正在開始長時間運行的工作線程。之後,我希望能夠繼續從我的JSP表單與該控制器進行交互,只要點擊表單中的按鈕,就可以在Controller中調用isThreadDone()。根據三個不同的結果,我然後相應地重定向。這與我目前的做法可能嗎?這似乎違反了Spring MVC的一些方法,但我想不出一個好的辦法來做到這一點,我可以把我的頭圍繞。如果在這裏有任何事情,請原諒我的無知。提前致謝。按鈕onClick調用Java方法直到某個結果

回答

1

看看Spring @Async註解。如果使用該註釋標註Service-layer Bean,它將在其自己的線程中運行,從而允許Controller線程在調用Service方法後不中斷地運行。通過synchronous方法讓該線程爲該服務的Class級別設置一個值,並且您的Controller代碼可以隨意檢查這些切換以查看該進程是否已完成。喜歡的東西:

@Service 
public myServiceClass { 
    private boolean isDone = false; 
    public synchronized void setIsDone(boolean isDone) { 
     isDone = isDone; 
    } 
    public synchronized boolean getIsDone() { 
     return isDone; 
    } 
    @Async 
    public void myServiceMethod() { 
     ...long-running stuff... 
     setIsDone(true); 
    } 

在控制器:

@Controller 
class MyController { 
    @RequestMapping 
    public kickOffHandlerMethod() { 
     myServiceClass.myServiceMethod(); 
     } 
    } 
    @RequestMapping 
    public dependentHandlerMethod() { 
     if(myServiceClass.getIsDone()) { 
     ...do something... 
     } 
    } 
} 

如果有多個請求可能會揭開序幕的過程,那麼我會保存每個isDone切換與某種標識符的HashMap中。然後線程會更新單個切換,每個請求一個。

1

好吧,任何事情都有可能,對吧?根據您提供的內容,您可以保留對該線程的引用(可能位於HttpSession中),以便在通過單擊按鈕發出新請求時,可以查詢該請求並返回適當的響應。

+0

我想過這個,但它似乎是一種解決方法,而不是解決方案。如果這是最好的方式,那麼這是最好的方法。謝謝你的幫助! – Matt

+0

@Matt:你關心的是什麼?如果您更清楚地定義您的方案,可能會出現更合適的解決方案。 –

相關問題