像Thread
,Socket
和其他java.io
类这样的类不是Serializable
出于某种目的而实现的。话虽如此,作为重构提示,我可以向您推荐的最好的事情是让您的应用程序在触发时提供一种保存和恢复状态的干净方式。由于您无法重新创建线程或网络连接的状态,因此根据问题域,您可能能够以一种使它们事务安全的方式编写您的类,而且您可以在关闭时记录正在运行的事务并确保它们是唤醒/反序列化后重新安排/重新启动。
(免责声明:即使您编辑了您的问题,它也很不具体,我只能在下面提供有根据的猜测和一般提示。)
首先,您在这里处理的是一个设计问题。在你解决了你的设计问题之后,AOP 可能有助于实现这个问题(它显然是横切的) 。例如,您可以有一个方面Interruptable
为相关类添加一个接口,并将其连接到实现所需行为的功能,例如ObjectState interrupt()
和void continue(ObjectState)
(所有类、接口和方法名称都是纯发明)。因此,虽然您将无法以您似乎描述的相当神奇的方式冻结您的应用程序,但通过一些努力,您可能能够以一种至少可以帮助您以某种方式重新启动它的方式保存应用程序状态恢复逻辑状态(不是像套接字连接、线程 ID 这样的技术状态),因此应用程序可以继续执行它在冻结之前所做的任何事情。
例如,下载管理器可以继续下载文件,因为它之前已经记录了它的逻辑状态:下载源、临时文件名和已写入的字节数。所以即使需要建立新的网络连接来继续下载,“事务”也不需要从头开始。我认为这就是你想要的。
写下这段独白,在我看来,我所描述的部分功能可能应该存在于现有的应用程序服务器或容器中(我不是那里的专家)。
因此,当您最终为所有相关的应用程序类找到了保持其逻辑状态的方法时,请回过头来问另一个问题,即如何使用 AspectJ 左右最好地做您想做的事情。:-)