[英]Can a Vaadin+Tomcat webapp be used to run a thread continuously?
我正在嘗試使用Vaadin前端構建一個Webapp,使用戶可以在我們的服務器上上傳和處理數據。 該過程非常復雜,並且是一個多線程應用程序(我們稱其為“核心”)。 在設計此應用程序時,我以為我可以將所有內容粘貼到tomcat服務器上,但是我的一位同事告訴我,Vaadin本質上是RESTful的,因此不會連續運行業務流程,因為該應用程序是無狀態的。 他聲稱,tomcat JVM將在運行請求后直接進入睡眠狀態,並且不會完成線程處理。 因此,他建議我使用RMI將數據發送到同一服務器上的另一個進程,然后在該服務器上進行處理。
我對此有一些疑問:
據我所知,Vaadin不使用REST服務進行客戶端-服務器通信。 它是有狀態的,並使用某種支持bean。
關於線程問題,如果直接從Vaadin組件調用長時間運行的任務,它將阻塞線程處理您的請求,直到任務完成為止。 從瀏覽器的角度來看,您必須等待並查看旋轉指示器,直到該過程完成(或由於請求超時引發的異常)。
您可以做的是在一個單獨的線程中運行長時間運行的任務。 如果希望新線程在同一JVM上運行,則不需要RMI之類的東西。 您可以通過以下兩種方式之一進行操作:
ExecutorService
(例如: Executors.newSingleThreadExecutor()
)並將任務提交到 請注意,您可能必須實現某種通知機制才能知道線程何時完成任務。
您可以根據需要從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.