2012-08-02 44 views
0

我正在使用RAP/RWT的設計,在Tomcat下工作。我現在正在學習RAP,並且出現了一些問題。Eclipse RAP/RWT獨立應用程序 - 最佳設計?

我的應用程序有一個後端,可以持續收集某些來源的數據。另一方面,我想創建一個運行爲web應用程序的前端(RWT獨立應用程序,或具有工作臺功能的RAP,尚未確定)。

  • 第一個問題:我是否應該將後端作爲單獨的進程保留,並讓前端RAP應用程序以某種方式與它進行通信?或者我可以將所有內容整合到RAP應用程序中嗎?將所有內容集成在一起會導致第二個問題。

  • 第二個問題:如何從RAP應用程序內檢測到,何時持有我的應用程序的瀏覽器窗口/選項卡關閉?當用戶關閉圖形界面時(即關閉瀏覽器),我想做一些資源清理。在RWT獨立應用程序中找不到與ApplicationWorkbenchWindowAdvisor#preWindowShellClose等效的任何內容。與應用程序啓動時相同。一般來說,在RWT獨立應用程序中是否有回調來遵循webapp生命週期?

非常感謝您的幫助!

回答

0

(*)第一:解耦永遠是最佳實踐。我使用RMI存根來接收來自後端應用程序(另一個RMI對象或EJB bean)的通知。

MyEJBListener stub = UnicastRemoteObject.exportObject(new MyEJBListener(display, page, 
            manager, handlermanager), 0) 
MyEJBClient client1 = MyEJBLocator.findEJBClient("abc"); 
client1.addListener(stub); 

在存根使用類似

public void notify(Event event){ 

    UICallBack.activate("stubthread"); 
    Display..asyncExec(new Runnable() { 
    // update event info 
    }); 
} 

(*)二:該方法WorkbenchWindowAdvisor#postWindowClose可以幫助您?,並調用somethig方法形式的後端應用程序。

1

關於第一點:當您使用EJB時​​,請注意您只能從請求線程直接訪問Java EE上下文。當您以JEE_COMPATIBILITY模式運行時,這不是問題,但在SWT_COMPATIBILITY模式下,您可能需要通過RWT.requestThreadExec(Runnable);訪問您的EJB。

至於你的第二個問題,RAP服務器目前沒有通知瀏覽器關閉。此問題在bug 284273 - Session kill mechanism on browser close中討論。它尚未實施,因爲IIRC我們無法找到一種可靠的方法來適用於所有瀏覽器。

您可以使用a)JSExecutor來實現您自己的解決方案,以便在瀏覽器關閉時發送請求的客戶端上放置一些JavaScript,以及b)監聽這些請求並終止會話的PhaseListener。