Почему он полностью реализует интерфейс реализует Serializable?


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

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

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

5 74

5 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

(...)

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