Почему freemarker.cache.TemplateCache имеет storeNegativeLookup? - PullRequest
0 голосов
/ 06 октября 2019

У меня есть template_update_delay = 24h для кэширования шаблонов в течение 24 часов. Если мой URLTemplateLoader получает IOException из-за временного простоя (http-статус 429), то freemarker.cache.TemplateCache вызовет storeNegativeLookup и также кэширует исключение.

cachedTemplate.templateOrException = e

// Template source was removed
if (!newLookupResult.isPositive()) {
    if(debug) {
        LOG.debug(debugName + " no source found.");
    } 
    storeNegativeLookup(tk, cachedTemplate, null);
    return null;
}
private void storeNegativeLookup(TemplateKey tk, 
        CachedTemplate cachedTemplate, Exception e) {
    cachedTemplate.templateOrException = e;
    cachedTemplate.source = null;
    cachedTemplate.lastModified = 0L;
    storeCached(tk, cachedTemplate);
}

Позже, даже если конечная точка URL активна и доступна, freemarker.cache.TemplateCache: getTemplate () будет продолжать выбирать cachedTemplate с IOException и будет перебрасывать исключение до тех пор, пока не истечет срок действия кэша.

else if(t instanceof IOException) {
   rethrown = true;
   throwLoadFailedException((IOException)t);
}

Это все время вызывает сбой приложения ((.

Как заставить Freemarker повторить выборку шаблона из источника вместо кэша, если в прошлый раз произошла исключительная ситуация?

1 Ответ

0 голосов
/ 12 октября 2019

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

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

Что вы можете сделать прямо сейчас? Вы можете поймать исключение, выданное Configuration.getTemplate, и пройти трассировку причины, чтобы выяснить, является ли первопричиной исключение, которое вы не хотите кэшировать, и затем вызвать Configuration.removeTemplateFromCache (но подумайте, стоит ли вам это делать. один раз в определенный промежуток времени). Я не уверен, может ли исключение с HTTP 429 быть надежно распознано "из коробки", или вам нужно настроить TemplateLoader так, чтобы сгенерированное исключение содержало необходимую информацию.

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