Nach meinem Verständnis von Servlet wird das Servlet vom Container instanziiert, seine init()
Methode wird einmal aufgerufen und das Servlet wird wie ein Singleton leben, bis die JVM heruntergefahren wird.
Ich erwarte nicht, dass mein Servlet serialisiert wird, da es neu erstellt wird, wenn der App-Server wiederhergestellt oder normal gestartet wird. Das Servlet sollte keine sitzungsspezifischen Mitglieder enthalten, daher ist es nicht sinnvoll, es auf die Festplatte zu schreiben und erneut zu instanziieren. Gibt es eine praktische Verwendung dafür?
Ich befürchte, dass ich dort einige nicht serialisierbare Felder einfüge und meine App dann in einer Produktionsumgebung, in der eine andere Art der Sitzungsreplikation stattfindet, auf mysteriöse Weise fehlschlägt.
quelle
Antworten:
Technisch gesehen glaube ich, dass der Servlet-Container das Servlet-Objekt auf die Festplatte "passivieren" darf, ähnlich wie es EJB-Session-Beans sein können. Sie stellen also zu Recht die Frage, ob Ihre App aufgrund nicht serialisierbarer Felder fehlschlägt.
In der Praxis habe ich noch nie von einem Container gehört, der dies tut. Es handelt sich also nur um Altgepäck aus den schlechten alten Zeiten des frühen J2EE. Ich würde mir darüber keine Sorgen machen.
quelle
<distributable />
in web.xml ausgelöst werden .HttpServlet sollte auf die Festplatte serialisiert werden und den Neustart des Servlet-Containers überleben. Mit Tomcat können Sie beispielsweise ein Flag einrichten, das diese Art des Überlebens ermöglicht. Die nächste Option ist die Übertragung mit JNDI. Dies ist kein Müll, sondern wird nur in extremen Anwendungsfällen verwendet.
quelle
Google scheint darauf hinzuweisen, dass dies getan wurde, damit Containerautoren die Option haben können, wenn sie dies wünschen.
Sie haben Recht, dass das Servlet keine sitzungsspezifischen Mitglieder enthalten sollte. Ich würde sogar denken, dass Sie so wenig Status wie möglich wünschen. Wenn Sie alles in Session oder ServletConfig speichern, können Sie die Serialisierung wahrscheinlich überleben.
quelle
Genau wie Sitzungsobjekte serialisiert werden, um Caches für die Servlet-Container zu überleben, die die Cluster-Option angeben, gibt es möglicherweise eine Option für einen Container, um eine Servlet-Instanz auch auf einen anderen Cluster-Knoten zu übertragen. Ich rate nur hier
quelle
Serializable wird als Markierungsschnittstelle für Sitzungsattribute in verteilten Umgebungen verwendet.
quelle