【问题标题】:Cross context communication between two web application deployed on same tomcat server部署在同一 tomcat 服务器上的两个 Web 应用程序之间的跨上下文通信
【发布时间】:2014-11-21 20:09:45
【问题描述】:

我有两个 Web 应用程序,webAppMasterwebAppSlave,部署在同一个 tomcat 服务器中。现在在 webAppMaster 应用程序中,有一个 java 类 RequestHandler,其 processRequest 方法以 customObject1 作为参数并返回customObject2。现在,从 webAppSlave 应用程序的 RequestCreator 类中,我想调用 RequestHandler 类的 processRequest 方法webAppMaster 应用程序。这应该怎么做? 提前致谢。

【问题讨论】:

  • 与@walkeros 的讨论让我使用了很棒的junixsocket 库在Unix 域套接字 上实现了RMI 解决方案。

标签: java web-services tomcat servlets rmi


【解决方案1】:

您需要在应用程序之间进行交谈,就好像您在两个远程应用程序之间进行交谈一样。它们在同一台服务器上并不重要,它们只需使用某种协议进行通信。

你想做的其实是RMI(远程方法调用)-http://docs.oracle.com/javase/tutorial/rmi/

您可以使用一些更轻量级的通信方式来代替使用 rmi。例如,您可以通过 Rest 进行通信。在这种情况下,在 webAppMaster 应用程序中创建 servlet,它将您的 customObject1 作为参数序列化为 JSON(作为 URL 请求参数或使用 POST 方法)。这个 servlet 会将 JSON 字符串转换为 customObject1 并调用 processRequest。稍后在 processRequest() 返回 customObject2 后将其转换为 JSON 并发送回客户端。在客户端读取 json 并将 JSON 反序列化回 webappSlave 中的 customObject2。

public class MasterServlet extends javax.servlet.http.HttpServlet {


      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          CustomObject1 customObject1 = buildCustomObject1BasingOnRequestParams(HttpServletRequest request); // read the request params and build your object either from json or whatever format webappSlave used to send

          CustomObject2 customObject2 = RequestHandler.processRequest(customObject1);
          String json = transformTOJson(customObject2); // there are many libaries which does this

          response.getWriter().print(json);    


      }
}

您的从属应用程序会反其道而行之。先将customObject1序列化为JSON,然后将接收到的JSON反序列化为customObjec2。

作为第三种选择,您可以使用 HTTP 隧道在应用程序之间发送对象(例如参考这篇文章:Serializing over HTTP correct way to convert object.)作为示例。

【讨论】:

  • 嗨@walkeros,感谢您的宝贵建议。但我想避免(如果可能)http 开销(序列化和反序列化),因为这两个应用程序彼此密切相关,因此总是在同一台服务器上。我对 Unix Domain Sockets 之类的东西很感兴趣。但不知道如何实现这一点(或类似的东西)。
  • 所以使用我的第一个建议。 RMI 是远程方法调用。这正是您所需要的。请参阅此处的示例 roseindia.net/tutorials/rmi/RMI-Example-2.shtml 。使用 RMI,您可以通过网络发送对象。它不涉及 HTTP。
猜你喜欢
  • 2012-12-28
  • 2012-02-14
  • 2012-06-23
  • 2014-03-07
  • 1970-01-01
  • 2011-08-31
  • 2013-03-16
  • 2011-12-15
  • 1970-01-01
相关资源
最近更新 更多