Questions & Answers

nick
I'm new here

Preview - Caching bei JSP-Includes

Hallo,

in unserem Projekt werden einige Bestandteile von Seiten per jsp:include-Anweisung inkludiert. Es geht hierbei um Bestandteile wie Header- und Footerbereich, Navigation usw. Bei den inkludierten Bestandteilen handelt es sich ebenfalls um Seiten aus der Strukturverwaltung.

Wir haben nun in der Preview das Problem, dass diese inkludierten Bestandteile nicht immer gecached werden, zu erkennen an den Log-Ausgaben der Preview-Applikation:

INFO  - generating 'homepage' ...

INFO  - generating page reference 'homepage' ...

INFO  - generating 'html_head' ...

INFO  - generating 'login_form' ...

INFO  - generating 'navigation' ...

INFO  - generating 'footer' ...

...

Das Problem ist, dass sich durch Neu-Generierung der inkludierten Seiten die Ladezeit der eigentlichen Seite in der Preview um ein Vielfaches erhรถht.

Die Frage ist, warum die inkludierten Seiten immer wieder neu gerendert werden, obwohl sich nichts daran geรคndert hat, und warum sie nicht aus dem Cache kommen? Wie kann man das Problem umgehen?

Ich habe festgestellt, dass die inkludierten Seiten gecached werden, wenn sie vorher einmal in der Preview geรถffnet wurden. Irgendwann fliegen diese Seiten aber wieder aus dem Preview-Cache und das Problem ist wieder da.

Hat jemand eine Idee?

Viele GrรผรŸe

Nick

0 Kudos
13 Replies
hoebbel
Crownpeak employee

Hallo Nick,

Vorschauseiten werden grundsรคtzlich nach einer gewissen Zeit wieder gelรถscht

Diese Zeit lรคsst sich รผber den Parameter preview.cacheTimeout in der fs-server.conf konfgurieren (Standardwert = 1200 Sekunden).

Erhรถhen lรคsst sich dieser Wert nur allgemein fรผr alle Vorschauseiten.

Lรถsungsansรคtze wรคren also entweder diesen Wert entsprechend zu erhรถhen oder die zu inkludierenden Seiten anders zur Verfรผgung zu stellen, so dass diese vom Preview Servlet nicht "aufgerรคumt" werden. Das wรผrde aber bedeuten, dass die Links zum Inkludieren dieser Seiten in der Vorschau hardkodiert werden mรผssten und die zu inkludierenden Seiten sich nur รคndern, wenn man die ausgelagerten Dateien manuell anpasst (wobei man hier natรผrlich auch die Seiten direkt aus dem Live-System verlinken kann, was das manuelle aktualisieren ersparen wรผrde, sofern das Live-System aus der Vorschau erreichbar ist)

Viele Grรผsse aus Dortmund,

  Holger

0 Kudos

Den cacheTimeout zu erhรถhen wรผrde uns auch nur vorรผbergehend helfen. Irgendwann mรผsste dann wieder jemand hingehen und die inkludierten Seiten einmal in der Preview aufrufen.

Der zweite Lรถsungsansatz wรผrde bedeuten, dass wir alle zu inkludierenden Seiten so umschreiben mรผssten, dass sie zusรคtzlich eine weitere Datei innerhalb der Preview-Applikation erzeugen, die dann inkludiert wird. Allerdings mรผssten wir das fรผr alle inkludierten Seiten tun, was einiges an Aufwand bedeuten wรผrde.

Mir ist noch nicht ganz klar, warum bei den Includes nicht der Caching-Mechanismus funktioniert. Kann man da irgendwie ansetzen?

Ich habe auch schon รผberlegt, ob man mit der Methode getPreviewUrl etwas erreichen kรถnnte. Ich hatte an sowas gedacht, wie fรผr die inkludierten Seiten automatisiert regelmรครŸig die Preview aufzurufen.

Jemand eine Idee?

0 Kudos

Mir ist noch nicht ganz klar, warum bei den Includes nicht der Caching-Mechanismus funktioniert. Kann man da irgendwie ansetzen?

Wieso meinst du, das der Caching-Mechanismus da nicht greift?

Ich habe auch schon รผberlegt, ob man mit der Methode getPreviewUrl etwas erreichen kรถnnte. Ich hatte an sowas gedacht, wie fรผr die inkludierten Seiten automatisiert regelmรครŸig die Preview aufzurufen.

Das kann man machen, wget reicht ja. Man muss nur den Login hinbekommen...

Peter
0 Kudos

> Wieso meinst du, das der Caching-Mechanismus da nicht greift?

Naja, wie oben beschrieben werden die inkludierten scheinbar immer neu generiert, und nicht aus dem cache geholt. Der JSP-Include scheint den Caching-Mechanismus zu umgehen, d.h. es fรผhrt nicht dazu, dass die inkludierte Seite in den Cache geschrieben wird. Liegt die inkludierte Seite alleridngs bereits im Cache wird auch diese gecachte Version beim JSP-Include angezogen.

> Das kann man machen, wget reicht ja. Man muss nur den Login hinbekommen...

Wie bekomme ich den Login denn hin?

0 Kudos

Ok, ich muss das nochmal revidieren. Es sieht wie folgt aus. Wir haben eine Standardseite, die eine andere Seite, z.B. den Header, per JSP-Include inkludiert. Wenn ich jetzt die Standardseite in der Preview aufrufe, passiert folgendes:

1) In den Logs sehe ich einen Eintrag, dass die Standardseite generiert wird.

2) Als nรคchstes sehe ich einen Eintrag, dass auch der Header generiert wird.

3) Im Preview-Cache-Verzeichnis sehe ich fรผr beide Seiten eine Datei

4) Wenn ich die Preview der Standardseite erneut aufrufe, werden wieder beide Seiten generiert (obwohl der Header bereits im Cache ist)

5) Wenn ich den Header jetzt in der Preview aufrufe รคndert das nichts

6) Danach rufe ich die Preview fรผr den Header mit forceRefresh auf

7) Rufe ich danach wieder die Standardseite in der Preview auf, wird der Header auf einmal beim jsp-include aus dem Cache geholt, (im Log ist kein Eintrag zu sehen, der auf eine erneute Generierung des Headers hindeutet).

D.h. irgendwie scheint es so zu sein, dass beim jsp-include nur die Seiten aus dem Cache geholt werden, die vorher mit forceRefresh in den Cache gekommen sind. Ohne forceRefresh wird beim jsp-include die Seite nicht aus dem Cache geholt, auch wenn Sie bereits gecacht ist.

Das Verhalten kann ich mir aber nicht erklรคren.

0 Kudos

Das "forceRefresh" Flag wird "durchgereicht". Es ist halt zur zwangsweise neu berechnet. Sollte auch so nachvollzogen werden kรถnnen.

  1. Request mit "forceRefresh"
    Rekursiv angeforderte Inhalte werden aktualisiert.

  2. Request ohne "forceRefresh"
    Rekursiv angeforderte Inhalte werden aus dem Cache ausgeliefert.

Um 1. zu umgehen, kannst du (da es ja JSP ist) vor dem jsp-include das "forceRefresh" explizit deaktivieren. Dafรผr im Request das Attribut "refresh" entweder entfernen oder auf "Boolean.FALSE" setzen.

Peter
0 Kudos

Ok, da passiert irgendwas, aber ich weiรŸ nicht was ๐Ÿ™‚

Das refresh scheint nicht durchgereicht zu werden. Ich habe es mir innerhalb der inkludierten Seiten ausgeben lassen und habe immer false gekriegt. Wenn ich refresh=false vor dem include setze, รคndert sich auch nichts.

Wenn ich aber innerhalb der inkludierten Seiten refresh=false setze, scheint es zu funktionieren. Wenn ich damit die Preview fรผr eine Seite generiere (mit oder ohne forceRefresh) werden die inkludierten Seiten aus dem Cache geholt.

Wรคre das dann eine Lรถsung fรผr mich? Also innerhalb aller inkludierten Seite refresh=false zu setzen?

0 Kudos

Zu frรผh gefreut. Nach einiger Zeit werden die inkludierten Seiten bei jedem Include wieder generiert. Dann hat das refresh=false doch nichts gebracht. Habe mir das gerade nochmal angesehen: offensichtlich hat es vorhin zunรคchst funktioniert, weil ich die Templates der Includes einmal aus- und eingecheckt hatte. So kann ich es jedenfalls gerade reproduzieren: Wenn ich die Vorlagen der inkludierten Seiten einmal aus- und einchecke werden diese danach immer aus dem Cache geladen.

Merkwรผrdig war, dass ich auch vorher schon zum Testen den preview-Cache zwischendurch geleert hatte. Da sah noch alles gut aus. Aber irgendwie scheint sich der Cache noch Details zu den gecachten Seiten zu merken ...

0 Kudos

Innerhalb der inkludierten Seiten etwas zu setzen hat รผberhaupt keinen Effekt.

Kannst du nicht mal den Wert des Request-Parameters jeweils ausgeben lassen und auch die Request-URL? Ich glaube, wenn du das hier postest, kรถnnte man mehr sehen.

Peter
0 Kudos

Type a product name