【问题标题】:Serializing a proxy object to access a remote servlet序列化代理对象以访问远程 servlet
【发布时间】:2011-03-31 23:12:13
【问题描述】:

我正在尝试编写一个代理,以从 Java 中的本地 HttpServlet 容器调用远程 servlet 对象,但不知何故我被 Howtos 卡住了。

在第一步,我尝试编写一个同时扩展 Servlet 和 Remote 的接口,以便在服务器端我可以将它注册到我的 servlet 容器中,并将它用作代理来序列化对驻留的 servlet 对象的调用在客户端。类似于以下代码:

public interface IServletRemote extends Remote, Servlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws RemoteException;

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws RemoteException;

    public void init() throws RemoteException;

    public void init(ServletConfig config) throws ServletException, RemoteException;

    public void destroy() throws RemoteException;
}

我无法超越构建接口,因为上面的代码导致以下错误,这是了解 Java 的多态/继承约束是合理的:

RemoteException 与 Servlet.init(ServletConfig) 中的 throws 子句不兼容

我不完全确定是否/如何找到从本地 servlet 容器远程调用 servlet 对象的解决方案。换句话说,我想知道考虑到 HttpServletRequest、HttpServletResponse 等的序列化要求,我想要实现的目标是否可行?

非常感谢任何提示。

【问题讨论】:

  • 这听起来像是一个简单问题的极其复杂的解决方案。您要解决的具体问题是什么?
  • 其实是一个复杂的问题。我正在尝试开发一种工具来在两台机器上动态分发 JEE Web 应用程序,其中分布边界是根据最初单一 JEE 应用程序的类之间交换的数据量来识别的。这更像是一个研究问题,我知道更简单的替代方案;但不知何故好奇我的想法是否会奏效。理论上,在应用足够的抽象和序列化之后,我应该能够通过 RMI 分发每个 Java 类。我的目标是在我的解决方案中实践理论。
  • 好吧,我不会对你想要做什么做出判断。但是,我会指出,您将需要能够远程代理流(请求和响应都与流一起使用)。您应该查看 rmiio 项目,它可以让您通过 rmi 使用流。
  • 我明白了,这解释了很多。抱歉我的怀疑,但没有上下文,你的问题看起来有点过于复杂。
  • @biziclop 我同意。很抱歉一开始没有提供足够的背景知识。

标签: java servlets rmi


【解决方案1】:

你不需要让远程接口实现 Servlet。相反,只需模仿远程接口中的方法。然后编写一个小 servlet 存根类,它将所有调用委托给远程代理。显然,您需要将 RemoteExceptions 包装在其他可以从 Servlet 方法抛出的异常中。

如果您想以通用方式执行此操作,那么您可能可以实现一个 java.lang.Proxy 处理程序,它为您执行委托(将 Servlet 接口方法与相关的远程版本匹配)。

【讨论】:

  • 谢谢@jtahlborn。我与一位同事讨论了这个问题,得出了类似的结论。今晚或明天将尝试并回来... ;)
  • 其实,如果你使用动态代理,你可以实现Servlet接口。您不必实现的是 Remote 接口,因为调用处理程序可以处理所有远程操作。
  • @bizicolp 感谢您的额外提示。我只是被它弄湿了。将在这里报告成功。
猜你喜欢
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
相关资源
最近更新 更多