簡體   English   中英

Vaadin + Tomcat Webapp可以用於連續運行線程嗎?

[英]Can a Vaadin+Tomcat webapp be used to run a thread continuously?

我正在嘗試使用Vaadin前端構建一個Webapp,使用戶可以在我們的服務器上上傳和處理數據。 該過程非常復雜,並且是一個多線程應用程序(我們稱其為“核心”)。 在設計此應用程序時,我以為我可以將所有內容粘貼到tomcat服務器上,但是我的一位同事告訴我,Vaadin本質上是RESTful的,因此不會連續運行業務流程,因為該應用程序是無狀態的。 他聲稱,tomcat JVM將在運行請求后直接進入睡眠狀態,並且不會完成線程處理。 因此,他建議我使用RMI將數據發送到同一服務器上的另一個進程,然后在該服務器上進行處理。

我對此有一些疑問:

  1. 他聲稱的一切都是真的嗎? 我不知道在Tomcat上實現Vaadin的一些復雜之處嗎?
  2. 我認為我很可能誤解了他,他實際上是在解釋為什么最好將演示文稿和業務組件分開(我完全同意)。 但是從純粹的理論角度來看,是否有可能將多線程內核與運行Vaadin的同一個tomcat服務器實例綁定在一起?

據我所知,Vaadin不使用REST服務進行客戶端-服務器通信。 它是有狀態的,並使用某種支持bean。

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

您可以做的是在一個單獨的線程中運行長時間運行的任務。 如果希望新線程在同一JVM上運行,則不需要RMI之類的東西。 您可以通過以下兩種方式之一進行操作:

請注意,您可能必須實現某種通知機制才能知道線程何時完成任務。

您可以根據需要從tomcat啟動單獨的線程。 您擁有什么前端都沒有關系。

但是重要的是,當您希望從另一個線程更新它們時,以正確的方式訪問vaadin UI組件。

對於vaadin 7,此功能已得到大大增強,以允許服務器立即使用。 在vaadin 6中,您必須為此使用一些工作環境。

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

我們在導出和報告生成中經常使用此概念。 -使用“導出/報告”上的單擊-在服務器上,我們啟動一個(低優先級)線程來構建報告/導出-在此期間,我們通過服務器推送更新客戶端上的進度條-一旦線程生成了導出/報告,發送到網絡瀏覽器

如果您希望核心始終運行並接受“工作”,那么也許最好選擇像石英之類的工作設備。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM