1

我需要序列化一个 Java 进程(到持久存储,如磁盘),然后杀死它。

然后在以后反序列化它并在以后重新复活它。

约束:

  1. 我已经有一组要添加此功能的流程。
  2. 因此,我正在寻找一种微创的解决方案。
  3. 这些进程的代码将重新建立与资源(如套接字、数据库等)的连接。
  4. 我需要做的是持久化线程状态、变量、对象等。

笔记:

  1. 我对围绕对象图序列化的问题有相当的了解。
  2. 许多年前,我从概念上想出了如何使用 AspectJ 做到这一点,但我找不到我的笔记
  3. 这个问题仅与 Java 进程有关——因此该解决方案适用于运行在 OSX、Linux 或 Windows 上的 JVM
  4. 所讨论的过程将能够重构以实现此功能。
4

2 回答 2

2

您不能以通用方式单独使用 Java 来做到这一点。您可以在虚拟机中运行 JVM,该虚拟机可以停止、保存在磁盘上并根据需要重新启动。请注意,必须重新建立网络连接。没有办法以可以透明地恢复的方式持久化它们,因为另一端会看到套接字已经消失。

于 2012-08-18T07:57:51.413 回答
1

Thread,Socket和其他java.io类这样的类不是Serializable出于某种目的而实现的。话虽如此,作为重构提示,我可以向您推荐的最好的事情是让您的应用程序在触发时提供一种保存和恢复状态的干净方式。由于您无法重新创建线程或网络连接的状态,因此根据问题域,您可能能够以一种使它们事务安全的方式编写您的类,而且您可以在关闭时记录正在运行的事务并确保它们是唤醒/反序列化后重新安排/重新启动。

(免责声明:即使您编辑了您的问题,它也很不具体,我只能在下面提供有根据的猜测和一般提示。)

首先,您在这里处理的是一个设计问题。在你解决了你的设计问题之后,AOP 可能有助于实现这个问题(它显然是横切的) 。例如,您可以有一个方面Interruptable为相关类添加一个接口,并将其连接到实现所需行为的功能,例如ObjectState interrupt()void continue(ObjectState)(所有类、接口和方法名称都是纯发明)。因此,虽然您将无法以您似乎描述的相当神奇的方式冻结您的应用程序,但通过一些努力,您可能能够以一种至少可以帮助您以某种方式重新启动它的方式保存应用程序状态恢复逻辑状态(不是像套接字连接、线程 ID 这样的技术状态),因此应用程序可以继续执行它在冻结之前所做的任何事情。

例如,下载管理器可以继续下载文件,因为它之前已经记录了它的逻辑状态:下载源、临时文件名和已写入的字节数。所以即使需要建立新的网络连接来继续下载,“事务”也不需要从头开始。我认为这就是你想要的。

写下这段独白,在我看来,我所描述的部分功能可能应该存在于现有的应用程序服务器或容器中(我不是那里的专家)。

因此,当您最终为所有相关的应用程序类找到了保持其逻辑状态的方法时,请回过头来问另一个问题,即如何使用 AspectJ 左右最好地做您想做的事情。:-)

于 2012-08-20T05:59:30.957 回答