2017-02-21 88 views
2

У меня есть приложение загрузки Spring Boot MVC, где я обслуживаю контент, упакованный в пакеты OSGi. Цель использования OSGi состоит в том, чтобы сделать эти пакеты контента полностью автономными и с возможностью «горячей» замены.Предотвращение Spring от попыток чтения старого потока ресурсов

Запросы сопоставляются для распределения ресурсов по URL-адресу.

Проблема, с которой я столкнулся, возникает, когда я заменяю пакет новым, на который будет указывать тот же URL-адрес, и запрос приходит для ресурса, который был отправлен из старого пакета.

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

Все, что я нашел до сих пор, связано с изменением политики кэширования на стороне клиента, а не внутреннего кеша Spring. Кроме того, попытка отключить кеш через spring.resource.chain.caching или spring.resources.cache-period не работает, поскольку Spring по-прежнему пытается определить последнюю измененную метку времени независимо.

ответ

2

Оказалось, что в этом случае есть конфигурация в неожиданном месте.

В моей WebMvcConfigurerAdapter удлинителей класса конфигурации, в методе addResourceHandlers:

registry.addResourceHandler("**/pluginresource/**") 
.setCacheControl(CacheControl.noStore()) 
.resourceChain(false) 
.addResolver(pluginResourceResolver); 

resourceChain(false) фактически устанавливает, будет ли или нет Spring создать цепочку с обработчиком по умолчанию, который использует кэширование.