JEP 385: Deprecate RMI Activation for Removal | 弃用 RMI 激活以进行移除
摘要
弃用 RMI Activation 机制,以便将来移除。RMI Activation 是 RMI 的一个已废弃的部分,自 Java 8 以来一直是可选的。RMI 的其他部分将不会被弃用。
动机
RMI Activation 实际上已被废弃
在过去的十年里,分布式系统一直基于 Web 技术。关于穿越防火墙、过滤请求、身份验证和安全性的问题都已在 Web 服务领域得到了解决。资源的延迟实例化由负载均衡器、编排和容器来处理。RMI Activation 模型中的分布式系统不包含这些机制。
RMI Activation 主要被弃用
RMI Activation 的使用已经几乎不存在。没有证据表明有新的应用程序正在使用 RMI Activation 编写,而且有证据表明很少有现有应用程序使用 RMI Activation。搜索各种开源代码库几乎没有发现任何与 Activation 相关的 API 的提及。多年来没有收到关于 RMI Activation 的外部生成的错误报告。在 Stack Overflow 问答网站上查询显示,大约有 2,200 个关于 RMI 的问题,但只有 14 个提到了“activation”。JavaRanch 论坛上最近关于 RMI Activation 的问题是在 2003 年发布的,而该论坛每天都会收到其他主题的数十个帖子。
RMI Activation 在 Java 8 中被设为可选。对于这个规范更改,没有提出任何反对意见,也没有收到关于 Activation 可选性的错误报告。
RMI Activation 带来了持续的维护负担
将 RMI Activation 作为 Java 平台的一部分进行维护会产生持续的维护成本。它增加了 RMI 的复杂性。RMI 仍在维护中,而 RMI Activation 增加了这种维护的开支。
RMI Activation 在 JDK 中有一系列测试。这些测试通常会调用 RMI Activation 服务(rmid
)以及客户端和服务器 JVM。这会导致测试运行缓慢,并且这些测试的多进程特性会导致一系列间歇性的、虚假的失败。
RMI Activation 的规范、实现和测试都带来了持续的维护开销。移除 RMI Activation 不会影响 RMI 的其余部分。移除 RMI Activation 不会降低 Java 对开发者的价值,但确实会降低 JDK 的长期维护成本。
描述
RMI Activation 机制允许基于 RMI 的服务导出存根,其有效性超出了远程对象或包含它的 JVM 的生命周期。在 常规(非可激活)RMI 中,远程对象一旦被销毁,存根就会失效。要从这种情况中恢复,客户端需要实现复杂的错误处理逻辑。当客户端在 可激活 存根上调用方法时,RMI Activation 服务会按需实例化远程对象,从而减轻客户端处理无效存根的负担。这似乎是一个有价值的机制,但是,正如动机部分所述,RMI Activation 的实际使用量几乎为零。
此 JEP 将弃用 RMI Activation 机制,以便将来移除。这需要对 Java 平台进行以下更改:
在 java.rmi.activation 包中的所有公共类和接口上添加
@Deprecated(forRemoval=true)
标记。在
java.rmi.activation
包声明中添加@deprecated
javadoc 标记和说明。在 java.rmi 模块规范中添加弃用 Activation 的通知。
在 RMI 规范的 RMI Activation 章节中添加弃用通知。
JDK 也将进行以下更改:
在
com.sun.rmi.rmid.ExecOptionPermission
和ExecPermission
类以及com.sun.rmi.rmid
包上添加@Deprecated(forRemoval=true)
标记。更改 rmid 工具以发出关于弃用的警告消息。
在 rmid 工具文档页面 上添加警告通知。这将包括关于
rmid
工具本身弃用的通知,还将包括关于com.sun.rmi.rmid
中权限类弃用的通知,因为此页面似乎是 JDK 中唯一记录这些权限类的地方。
备选方案
保留 RMI Activation
一种备选方案是保留 RMI Activation,就像过去几年所做的那样。这将继续带来持续的质量风险和维护负担。持续的成本是不断产生的,而这个基本上未被使用的机制为平台带来的极少价值无法证明这些成本的合理性。
从 JDK 构建中移除 RMI Activation
RMI Activation 是 Java 平台的一个可选部分,因此可以从 JDK 构建中省略。可以删除实际实现并用抛出 UnsupportedOperationException
的方法替换。测试也可以被移除。
然而,JDK 是 Java 平台的参考实现,参考实现需要包含所有可选特性以便进行测试。因此,RMI Activation 的实现和测试不能简单地从 JDK 中删除。相反,它们必须通过构建系统有条件地配置。对于参考实现构建,会包含 Activation 以便进行适当测试,而在生产构建中可能会省略它。
这将增加系统的复杂性。构建过程需要增强以支持两种模式。持续集成系统需要增加运行以构建和测试两种配置。实现和测试仍存在于系统中,并且必须继续进行持续维护。因此,从 JDK 构建中移除 RMI Activation 不会减少整体维护负担,而这正是此 JEP 的目标。
风险与假设
存在第三方产品使用 Activation 的可能性,因此它们可能会受到其弃用和最终移除的影响。然而,考虑到过去几年关于 Activation 变更的反馈很少,这种可能性不大。Activation 仍然存在于早期的 JDK 版本中,其中一些版本有长期支持。依赖 Activation 的应用程序可以继续在一段时间内依赖现有的受支持的 JDK,同时迁移到更新的技术。
Apache River 项目包含 RMI 和 Jini 技术的分支版本,包括一个激活机制。River 的这一部分依赖于 Java 的 java.rmi.activation
类型。从 Java 中移除 RMI Activation 将阻止 River 项目迁移到 Java 的最新版本,除非他们能够移除对 Java 类型的依赖。