2014-09-02 73 views
0

我正在嘗試使用Vaadin前端構建一個Web應用程序,該應用程序允許用戶在我們的服務器上上傳和處理數據。這個過程相當複雜,並且是一個多線程應用程序(我們稱之爲'核心')。在設計這個應用程序時,我認爲我可以將所有東西都放在tomcat服務器上,但我的一位同事告訴我,在本地,Vaadin是RESTful的,因此不會持續運行業務流程,因爲應用程序是無狀態的。他聲稱,tomcat JVM將在運行請求之後進入休眠狀態,而不是完成線程進程。因此,他建議我使用RMI將數據發送到同一臺服務器上的另一個進程,並在那裏處理它。可以使用Vaadin + Tomcat webapp連續運行線程嗎?

我有這幾個問題:

  1. 是他所聲稱的真實呢?我不知道在Tomcat上實施Vaadin有些複雜嗎?
  2. 更有可能我認爲我誤解了他,他實際上是在解釋爲什麼分離演示和業務組件更好(我完全同意)。但從純粹的理論角度來看,是否可以將多線程核心與運行Vaadin的核心綁定到同一個tomcat服務器實例上?

回答

2

據我所知不同,Vaadin不適用於客戶機 - 服務器通信使用REST服務。它是有狀態的,並使用某種輔助豆類。

關於你的線程問題,如果直接從Vaadin組件調用你的長期運行的任務,它會阻止線程處理您的請求,直到任務完成。從瀏覽器的角度來看,您必須等待並看到旋轉指示器,直到該過程完成(或由於請求超時而引發異常)。

你可以做的是在單獨的線程中運行長時間運行的任務。如果你想讓新的線程在同一個JVM上運行,你不需要像RMI那樣的東西。 您可以通過做到這一點:

請注意,你可能不得不實行某種形式的通知機制,知道什麼時候該線程已完成任務。

1

您可以從Tomcat作爲需要啓動單獨的線程。 無論你有什麼前端,這都沒關係。

但重要的是,當你想從另一個線程更新它們訪問vaadin UI組件的正確方法。

對於vaadin 7這已被大大增強,以允許服務器推送開箱。 在vaadin 6中,您必須爲此使用一些工作環節。

https://vaadin.com/book/-/page/advanced.push.html#advanced.push.running

我們使用這個概念很多關於出口和生成報告。 - 使用點擊導出/報告 - 在服務器上,我們啓動一個(低優先級)線程,構建報告/導出 - 在此期間,我們通過服務器推送更新客戶端上的進度條 - 一旦線程生成出口/報告中,我們將其發送到網頁瀏覽器

如果你想有一個核心始終運行並接受「工作」,那麼也許你更好地工作sheduler如石英或類似的服務。