Почему HttpServlet реализует Serializable?

В моем понимании Servlet Servlet будет создан экземпляр контейнером, его метод init() будет вызываться один раз, и сервлет будет жить как одноэлемент, пока JVM не выключится.

Я не ожидаю, что мой сервлет будет сериализован, так как он будет создан новым, когда сервер приложений восстановится или начнется нормально. Сервлет не должен содержать членов, специфичных для сеанса, поэтому нет смысла записывать их на диск и повторно создавать. Есть ли практическое применение для этого?

Мои проблемы заключаются в том, что я помещал туда некоторые несериализуемые поля, а затем мое приложение будет таинственно терпеть неудачу в производственной среде, где будет выполняться репликация другого типа.

Ответ 1

Технически я считаю, что контейнеру сервлета разрешено "пассивить" объект сервлета на диск, аналогично тому, как это может быть сеанс EJB beans. Поэтому вы правы, чтобы задать вопрос, будет ли ваше приложение терпеть неудачу из-за несериализуемых полей.

На практике я никогда не слышал о контейнере, делающем это, так что это действительно просто устаревший багаж из плохих старых ранних J2EE. Я бы не стал беспокоиться об этом.

Ответ 2

HttpServlet следует сериализовать на диск и выжить при перезагрузке контейнера сервлета. Например, tomcat позволяет вам установить флаг, который позволяет выжить такого рода. Следующая опция - передача с использованием JNDI. Это не мусор, он используется только в экстремальных случаях использования.

Ответ 3

Google, похоже, предположил, что это было сделано, чтобы авторы контейнеров могли иметь возможность, если они этого захотят.

Вы правы, что сервлет не должен содержать членов, специфичных для сеанса, на самом деле я бы подумал, что вы хотите как можно меньше состояний вообще. Если вы храните все в сеансе или в ServletConfig, я думаю, вы сможете выжить в сериализации.

Ответ 4

Точно так же, как объекты сеанса сериализуются, чтобы выжить в кэшах для этих серверов servletcontainers, предоставляющих параметр кластера, может быть опция для контейнера для передачи экземпляра Servlet также в другой кластер node? Я просто догадываюсь здесь.

Ответ 5

Serializable используется как интерфейс маркера для атрибутов сеанса в распределенной среде.

SRV.7.7.2 Распределенная среда (JSR-154)

В приложении, помеченном как распространяемое, все запросы, которые являются частью сеанса, должны обрабатываться одной виртуальной машиной Java ( "JVM" ) одновременно. Контейнер должен иметь возможность обрабатывать все объекты помещается в экземпляры класса HttpSession, используя setAttribute или putValue. Следующие ограничения для удовлетворения этих условий:

  • Контейнер должен принимать объекты, реализующие интерфейс Serializable.
  • Миграция сеансов будет обрабатываться с помощью конкретных контейнеров.

Распределенный контейнер сервлета должен IllegalArgumentException для объектов, где контейнер не может поддерживать механизм, необходимый для миграции хранения сеанса их.

Распределенный контейнер сервлета должен поддерживать необходимый механизм для переносящие объекты, которые реализуют Serializable.

(...)

Поставщик контейнеров может обеспечить масштабируемость и качество обслуживания такие функции, как балансировка нагрузки и восстановление после отказа от , обладающих способностью переместите объект сеанса и его содержимое из любого активного nodeраспределенной системы к другому node системы. Если распределена контейнеры сохраняют или переносят сеансы, чтобы обеспечить качество сервисные функции, они не ограничены использованием собственной JVM Механизм сериализации для сериализации HttpSessions и их атрибутов. Разработчики не гарантируют, что контейнеры будут звонить readObject и writeObject для атрибутов сеанса, если они реализуйте их, , но гарантируется, что Serializable замыкание их атрибуты будут сохранены.