【问题标题】:Eclipse RAP / RWT Standalone applications - Best design?Eclipse RAP / RWT 独立应用程序 - 最佳设计?
【发布时间】:2015-04-21 19:43:23
【问题描述】:

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

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

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

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

非常感谢您的帮助!

【问题讨论】:

    标签: eclipse eclipse-rap


    【解决方案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 来实现自己的解决方案。

    【讨论】:

      【解决方案2】:

      (*) 首先:解耦始终是最佳实践。我使用 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可以帮到你吗,并在后端应用程序中调用一些方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-10
        • 2015-11-29
        • 1970-01-01
        • 2018-01-21
        相关资源
        最近更新 更多