我正在设计一个使用RAP / RWT,在Tomcat下工作。我现在正在学习RAP,我想到了几个问题。
我的应用程序有一个后端,可以不断收集某些来源的数据。另一方面,我想创建一个前端(RWT独立应用程序,或具有工作台功能的RAP,尚未决定)作为webapp运行。
第一个问题:我应该将后端作为一个单独的进程保留,让前端RAP应用程序以某种方式与之通信吗?或者我可以将所有内容集成到RAP应用程序中吗?将所有内容整合在一起会产生第二个问题。
第二个问题:如何在RAP应用程序中检测到浏览器窗口/选项卡何时保持我的应用程序?当用户关闭图形界面(即关闭浏览器)时,我想做一些资源清理。我在RWT独立应用程序中找不到与ApplicationWorkbenchWindowAdvisor#preWindowShellClose
等效的内容。与应用程序启动时的dected相同。一般来说,在RWT独立应用程序中是否存在遵循webapp生命周期的回调?
非常感谢你的帮助!
答案 0 :(得分: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。
答案 1 :(得分: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方法。