JEP 385: Deprecate RMI Activation for Removal
Перевод RMI Activation в статус Deprecated for Removal (устаревший, будет удалён)
| Ответственный | Stuart Marks |
| Тип | Feature |
| Область | SE |
| Статус | Closed / Delivered |
| Выпуск | 15 |
| Компонент | core-libs / java.rmi |
| Обсуждение | core dash libs dash dev at openjdk dot java dot net |
| Трудоёмкость | XS |
| Длительность | XS |
| Связан с | JEP 407: Remove RMI Activation |
| Рецензенты | Alan Bateman, Roger Riggs |
| Одобрен | Brian Goetz |
| Создан | 2020/05/13 02:43 |
| Обновлён | 2021/08/28 00:23 |
| Задача | 8244917 |
Аннотация
Перевести механизм RMI Activation в статус Deprecated for Removal, чтобы в будущем удалить его. RMI Activation — устаревшая часть RMI, которая необязательна начиная с Java 8. Никакие другие части RMI не будут объявлены устаревшими.
Мотивация
RMI Activation фактически устарел
Распределённые системы строятся на веб-технологиях по меньшей мере последние десять лет. Вопросы прохождения через межсетевые экраны, фильтрации запросов, аутентификации и безопасности уже решены в области веб-сервисов. Отложенным созданием ресурсов занимаются балансировщики нагрузки, средства оркестрации и контейнеры. Ни одного из этих механизмов нет в модели распределённых систем RMI Activation.
RMI Activation почти не используется
RMI Activation используется исчезающе мало. Нет никаких свидетельств того, что пишутся новые приложения с использованием RMI Activation, и есть свидетельства того, что RMI Activation использует очень мало существующих приложений. Поиск по различным кодовым базам с открытым исходным кодом почти не выявил упоминаний каких-либо API, связанных с Activation. Уже несколько лет не поступало ни одного внешнего сообщения об ошибке в RMI Activation. Запрос на сайте вопросов и ответов Stack Overflow находит около 2 200 вопросов о RMI, но только в 14 из них упоминается «activation». Последний вопрос о RMI Activation на форуме JavaRanch был опубликован в 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 экспортировать заглушки (stubs), которые остаются действительными дольше, чем существует удалённый объект или содержащая его JVM. В обычном RMI (без Activatable) заглушка становится недействительной сразу после уничтожения удалённого объекта. Чтобы восстановиться в такой ситуации, клиентам приходится реализовывать сложную логику обработки ошибок. Когда клиент вызывает метод активируемой заглушки, сервис RMI Activation создаёт удалённый объект по требованию, избавляя клиентов от необходимости иметь дело с недействительными заглушками. Этот механизм кажется ценным, однако, как описано в разделе «Мотивация», реальное использование RMI Activation исчезающе мало.
Этот JEP переведёт механизм RMI Activation в статус Deprecated for Removal для последующего удаления. Для этого в платформу Java вносятся следующие изменения:
-
Добавить
@Deprecated(forRemoval=true)ко всем публичным классам и интерфейсам пакета java.rmi.activation. -
Добавить тег javadoc
@deprecatedи пояснение в объявление пакетаjava.rmi.activation. -
Добавить уведомление о том, что Activation объявлен устаревшим, в спецификацию модуля java.rmi.
-
Добавить уведомление об устаревании в главу RMI Activation спецификации RMI.
В JDK также будут внесены следующие изменения:
-
Добавить
@Deprecated(forRemoval=true)к классамcom.sun.rmi.rmid.ExecOptionPermissionиExecPermissionи к пакетуcom.sun.rmi.rmid. -
Изменить инструмент rmid, чтобы он выводил предупреждение об устаревании.
-
Добавить предупреждения на страницу документации инструмента rmid. Среди них будет уведомление о том, что устаревшим объявлен и сам инструмент
rmid. Также там будет уведомление о том, что устаревшими объявлены классы разрешений вcom.sun.rmi.rmid, поскольку эта страница, по-видимому, единственное место в JDK, где эти классы разрешений документированы.
Альтернативы
Оставить RMI Activation как есть
Одна из альтернатив — оставить RMI Activation как есть, как это было последние несколько лет. Он по-прежнему будет создавать постоянный риск для качества и нагрузку на сопровождение. Эти затраты постоянны и не оправдываются той минимальной пользой, которую этот практически не используемый механизм приносит платформе.
Исключить RMI Activation из сборок JDK
RMI Activation — необязательная часть платформы Java, поэтому его можно было бы исключить из сборок JDK. Саму реализацию можно было бы удалить и заменить методами, выбрасывающими UnsupportedOperationException. Тесты также можно было бы удалить.
Однако JDK — эталонная реализация платформы Java, а эталонные реализации обязаны включать все необязательные возможности, чтобы их можно было тестировать. Поэтому реализацию и тесты RMI Activation нельзя было бы просто удалить из JDK. Вместо этого их пришлось бы подключать в зависимости от настроек системы сборки. Activation включался бы в сборки эталонной реализации, чтобы его можно было как следует тестировать, а из рабочих сборок, скорее всего, исключался бы.
Это усложнило бы систему. Процесс сборки пришлось бы доработать для поддержки обоих режимов. В системы непрерывной интеграции пришлось бы добавить запуски для сборки и тестирования обеих конфигураций. Реализация и тесты по-прежнему оставались бы в системе, и их пришлось бы постоянно сопровождать. Поэтому исключение RMI Activation из сборок JDK не уменьшило бы общую нагрузку на сопровождение, а именно в этом состоит цель этого JEP.
Риски и допущения
Возможно, Activation используют сторонние продукты, и тогда их затронет перевод Activation в устаревшие и его последующее удаление. Это маловероятно, учитывая, что за последние несколько лет на изменения в Activation не поступало откликов. Activation по-прежнему есть в более ранних выпусках JDK, некоторые из которых имеют Long-Term Support (долгосрочная поддержка). Приложения, зависящие от Activation, могут ещё какое-то время полагаться на существующие поддерживаемые JDK, переходя тем временем на более новые технологии.
Проект Apache River содержит ответвлённые версии RMI и технологии Jini, включая механизм активации. Эта часть River зависит от типов Java java.rmi.activation. Удаление RMI Activation из Java не позволит проекту River перейти на последние версии Java, если его разработчики не смогут избавиться от зависимости от этих типов Java.