Построение асинхронного шаблона кэша с JSP - PullRequest
1 голос
/ 10 мая 2010

У меня есть JSP, на рендеринг которого уйдет около 8 минут. Сама логика кода не может быть сделана более эффективной (она будет часто обновляться и обновляться в основном остроконечным боссом). Я попытался обернуть его слоем кэширования, как

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

Это хорошо, пока 60 секунд не закончится. Следующий запрос после этого блокируется до 8 минут рендеринга снова. Мне нужен способ построить шаблон что-то вроде:

  1. Если в кэше нет версии динамического содержимого, запустите фактическую логику (и заполните кэш для последующих запросов)
  2. Если в кеше есть версия динамического содержимого с истекшим сроком действия, служит для вывода логики JSP из кеша
  3. Если в кеше имеется просроченная версия динамического содержимого, подайте на выход логики JSP still из кеша AND запустите логику JSP в фоновом режиме, чтобы кэш обновляется прозрачно для пользователя - избегая пользователя ждать 8 минут

Я обнаружил, что, по крайней мере, EHCache может выполнять какое-то асинхронное обновление кэша, но, к сожалению, это не относится к тегам JSP ... Также мне нужно взять 10-20 параметров для реальной логики JSP и некоторые из них должны использоваться в качестве ключа для кэширования.

Пример кода и / или указатели будут очень оценены. Мне, честно говоря, все равно, если предоставленное решение будет крайне уродливым. Я просто хочу простое 5-минутное кеширование с асинхронным обновлением кеша с учетом некоторых параметров в качестве ключа.

1 Ответ

2 голосов
/ 11 мая 2010

Если ваши кэшированные данные являются общими для всех пользователей, использование области видимости JSTL application позволяет кэшировать ваш фрагмент JSP. Если это на пользователя, то session scope.

Наряду с этим используйте другую переменную для записи метки времени обновления кэша или, наоборот, время истечения. Пример ниже:

<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>

Позже:

Если (текущее время системы + 5)> cachedRefreshTimestamp, снова получить данные в отдельном цикле, перезаписать обратно в cachedData и обновить также cachedRefreshTimestamp

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