2010-05-10 4 views
1

Je dispose d'un JSP qui prendra environ 8 minutes à afficher. La logique de code elle-même ne peut pas être rendue plus efficace (elle mettra à jour souvent et sera mise à jour par fondamentalement un chef aux cheveux pointu). Je l'ai essayé emballage avec une couche de mise en cache commeCréation d'un modèle de cache asynchrone avec JSP

<%@ taglib uri="/WEB-INF/classes/oscache.tld" prefix="oscache" %> 
<oscache:cache time="60"> 
    <div class="pagecontent"> 
    ..... my logic 
    </div> 
</oscache:cache> 

C'est bien jusqu'à ce que 60 secondes est terminée. La requête suivante après cela bloque jusqu'à ce que les 8 minutes de rendu soient à nouveau effectuées. Je besoin d'un moyen de construire un modèle quelque chose comme:

  1. S'il n'y a pas de version du contenu dynamique dans le cache exécuter la logique réelle (et alimenter le cache pour les demandes ultérieures)
  2. En cas de la version non expirée du contenu dynamique dans le cache sert la sortie de la logique JSP du cache
  3. S'il existe une version expirée du contenu dynamique dans la mémoire cache, la sortie de la logique JSP reste depuis le cache ET exécutez la logique JSP en arrière-plan afin que le cache soit mis à jour de manière transparente pour l'utilisateur - avoi Ding l'utilisateur doit attendre 8 minutes

J'ai découvert qu'au moins EHCache pourrait être en mesure de faire une mise à jour de cache asynchrone mais il ne semble pas tristement s'appliquer aux balises JSP ... Aussi je dois prendre dans 10-20 paramètres pour la logique réelle de la JSP et certains d'entre eux devraient être utilisés comme une clé pour la mise en cache.

Un exemple de code et/ou des pointeurs seraient considérablement apprécié. Je ne m'en soucie pas franchement si la solution fournie est extrêmement laide. Je veux juste une mise en cache simple de 5 minutes avec mise à jour du cache asynchrone en prenant en compte certains paramètres comme une clé.

Répondre

2

Si vos données mises en cache sont communes à tous les utilisateurs, l'utilisation de la portée JSTL application vous permet de mettre en cache votre fragment JSP. Si c'est par utilisateur, alors session portée. Parallèlement à cela, utilisez une autre variable pour enregistrer l'horodatage de rafraîchissement du cache ou, inversement, un temps d'expiration. Un exemple ci-dessous:

<c:if test="${empty cachedData}"> 
<c:set var="cachedData" scope="application"> 
<%-- Cached JSP content goes here --> 
</c:set> 
<c:set var="cachedRefreshTimestamp" 
    value="<%= new Long(new java.util.Date().getTime()) %>" 
    scope="application"/> 
</c:if> 

plus tard:

Si (système heure + 5)> cachedRefreshTimestamp, aller chercher les données à nouveau en boucle séparée, écraser de nouveau dans cachedData, et mettre à jour cachedRefreshTimestamp également

Questions connexes