0

我正在使用 RAP/RWT 进行设计,在 Tomcat 下工作。我现在正在学习 RAP,我想到了几个问题。

我的应用程序有一个后端,可以不断地从某些来源收集数据。另一方面,我想创建一个作为 webapp 运行的前端(RWT 独立应用程序,或具有工作台功能的 RAP,尚未确定)。

  • 第一个问题:我是否应该将后端作为一个单独的进程,让前端 RAP 应用程序以某种方式与之通信?或者我可以将所有内容集成到 RAP 应用程序中吗?将所有内容整合在一起会导致第二个问题。

  • 第二个问题:如何从 RAP 应用程序中检测到,浏览器窗口/选项卡何时关闭我的应用程序?当用户关闭图形界面(即关闭浏览器)时,我想做一些资源清理。ApplicationWorkbenchWindowAdvisor#preWindowShellClose我在 RWT 独立应用程序中找不到任何等效的东西。与启动应用程序时检测到的相同。一般来说,在 RWT 独立应用程序中是否有遵循 webapp 生命周期的回调?

非常感谢你的帮助!

4

2 回答 2

1

关于您的第一点:当您使用 EJB 时,请注意您只能从请求线程直接访问 Java EE 上下文。当您在JEE_COMPATIBILITY模式下运行时这不是问题,但在 SWT_COMPATIBILITY 模式下您可能需要通过RWT.requestThreadExec( Runnable );.

至于你的第二个问题,RAP 服务器目前不会在浏览器关闭时得到通知。错误 284273 - 浏览器关闭时的会话终止机制中讨论了此问题。它尚未实现,因为 IIRC 我们找不到在所有浏览器中都有效的可靠方法。

您可以使用 a) JSExecutor 将一些 JavaScript 放在客户端上,在浏览器关闭时发送请求,以及 b) 侦听这些请求并终止会话的 PhaseListener 来实现自己的解决方案。

于 2012-08-23T13:31:58.063 回答
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可以帮助你吗?,并在后端应用程序中调用一些方法。

于 2012-08-03T00:26:25.413 回答