序列化Java进程然后对其进行反序列化 - 最好是以非侵入方式

时间:2012-08-17 22:03:39

标签: java serialization aspectj

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

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

约束:

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

    1. 我对围绕对象图序列化的问题了如指掌。
    2. 很多年前,我从概念上想出了如何使用AspectJ做到这一点,但我找不到我的笔记
    3. 此问题仅适用于Java Process - 因此解决方案适用于在OSX,Linux或Windows上运行的JVM
    4. 有问题的流程可以重构以实现此功能。

2 个答案:

答案 0 :(得分:2)

您无法以通用方式单独使用Java。您可以在虚拟机中运行JVM,可以将其停止,保存在磁盘上并根据需要重新启动。注意,必须重新建立网络连接。没有办法以一种可以透明方式恢复的方式来保持它们,因为另一端会看到插座已经消失。

答案 1 :(得分:1)

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

(免责声明:即使在你编辑了你的问题之后,它也是如此不明确,以至于我只能在下面提供有根据的猜测和一般提示。)

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

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

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

因此,当您最终为所有相关应用程序类找到一种方法来保持其逻辑状态时,请回过头来询问另一个关于如何使用AspectJ最佳地执行所需操作的问题。 : - )