2012-08-02 45 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。