6

有谁知道如何使用 Java 实现强大的代码移动性?你以前做过吗?

这是我试图实现的目标。

假设我们有 2 个独立的 Java 应用程序通过网络进行通信。应用 A 和应用 B。

应用 A 有一个类 x 实例化为一个对象,并且一直在使用它。应用 B 没有此类 x 的先验知识。

App A 需要将 class x 的实例迁移到 App B。 App B 应该能够动态加载 class x,并保留 class x 的状态

我用谷歌搜索了很多关于如何在运行时动态加载类的资源。但是,我不确定是否涵盖了通过网络传输对象实例及其状态以及动态调用它的机制。

任何指示都会非常有帮助,并提前感谢您!

注意:我最感兴趣的是如何(即方法,思考方式)这个问题是如何解决的,而不是用来解决这个问题的;这是因为我的任务是想出我自己的解决方案来解决这个问题。尽管指出库/框架很棒,但如果答案是从以前做过类似事情的人那里发布的(尽管很少见),那将是理想的。

4

6 回答 6

2

你问的是强移动性,但你的要求是通过弱移动性来满足的,RMI 协议提供了一些限制。RMI 不仅支持 RPC、对象序列化和分布式对象图,还支持通常使用的代码共享,以便客户端可以加载只有服务器知道的类的字节码并在本地执行该字节码。

Java 不支持强大的移动性,如果不对 VM 进行专有扩展,我想不出一种方法来实现它。从本质上讲,Java 上下文中的强大移动性意味着您暂停或暂停一个 VM 中的线程,将所有可从该线程访问的对象实例、执行所需的字节码和内部线程 st(调用堆栈等)传输到一个不同的VM并使其重新创建线程状态并在原始VM中线程暂停的点继续执行。

于 2009-11-17T18:05:46.320 回答
1

我已经编写了一个开源库,它完全按照上面的要求支持代码移动性。实际上它也支持 RPC 类型的使用。

请参阅:Mobility-RPC - Java 平台的无缝代码移动性和 RPC

就弱机动性与强机动性的区别而言:在中间

当您将对象传输到远程机器时,您可以控制在对象到达远程机器时调用对象上的哪个方法以及使用哪些参数。因此,如果您正在编写一个移动代理,那么它可以自行决定如何在下一台机器上恢复执行,然后再转移自己,而不必从同一个地方恢复。

于 2012-02-21T19:33:14.957 回答
0

在普通 Java 中,您需要某种方式让 App B 加载对象的类,然后您需要将对象从 App A 序列化到 App B。如果这些类在某个中心位置可用,您也许可以这样做例如 HTTP 服务器。但在一般情况下,如果您想将一个全新的对象传输到 App B,您需要实现自己的类加载器(或找到执行此操作的库)。

如果您的所有对象都是可序列化的,并且您有一个存储类的中心位置,那么这应该很容易实现。您可以使用 URLClassLoader 从 http 服务器加载类,然后使用普通的 Java 序列化来传输序列化对象。应用程序 A 和 B 之间需要进行一些协调,以便 B 知道要加载哪个类,A 知道何时发送对象,而 B 知道如何继续执行对象的方法。使用这种方法,对象 X 可能无法执行方法。它必须停止然后与 App A 合作重新开始执行。

于 2009-11-17T17:52:09.233 回答
0

为了移动类 C 的实例 I,您需要从 A 转移到 B 的两件事。

首先是 C 的类定义(通常以字节码列表的形式),然后是 I 的序列化形式。请注意,您应该使用 XML 序列化而不是旧的二进制序列化。

真正棘手的部分是转移 C 的依赖关系,因为您实际上也需要转移 C 的所有超类,以及所有返回类型和字段类型,以及它们的超类和返回/字段类型等等等。

如果你真的需要为 C 的所有可能值执行此操作,那么最好的选择是使用旨在执行此操作的框架,例如 grid one 或 Terracotta。如果你能约束自己,例如一个给定的和狭窄的界面,你可能会好得多。还可以考虑为此使用属性,因为它们非常简单并且可以让您走得更远。

于 2009-11-17T18:33:20.600 回答
0

有一个名为cajo的项目可以通过网络动态移动对象。不过,我不确定执行状态。

于 2009-11-17T17:48:20.677 回答
-2

如果你使用 JDK6,你可以发送源代码,编译它,所以现在类加载器可以找到这个新类,因为它是动态编译的。

那么诀窍是您可能需要使用一些 DI 将其加载到您的应用程序中,因此您需要一个可以动态工作的 DI 框架。

然后,当它被注入到您的类中时,您可以在该点设置属性。

这些应该有一个已知的接口。需要有一个双方都可以依赖的合同。

我还没有尝试过,我认为 Java 不是正确的语言。如果您必须拥有此功能,您可能希望查看 jvm 脚本语言或 Clojure 之类的东西,因为我希望它也可以使用它,然后让您的 java 应用程序与其他动态框架交互,就像它会都在jvm上运行。

更新:

这是一个关于动态编译的链接,使用 JDK5,因为它是许多人可能不熟悉的东西。

http://fivedots.coe.psu.ac.th/~ad/jg/javaArt1/index.html

于 2009-11-17T18:10:08.413 回答