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