Я не совсем точно знаю, как это сделать ... так что может потребоваться несколько попыток, чтобы этот вопрос был правильным. У меня есть аннотация для кэширования результатов метода. Мой кодом является частным вилки на данный момент, но часть я работаю начинается здесь: https://code.google.com/p/cache4guice/source/browse/trunk/src/org/cache4guice/aop/CacheInterceptor.java#46AOP + синхронизированный
Я аннотированный метод, который я хочу кэшированный, который работает очень медленный запрос, иногда занимает несколько минут запустить. Проблема в том, что мое асинхронное веб-приложение продолжает привлекать новых пользователей и запрашивать одни и те же данные. Однако метод getSlowData() еще не завершен.
Так что-то вроде этого:
@Cached
public getSlowData() {
...
}
Внутри перехватчик, мы проверяем кэш и обнаружить, что это не кэшируются, который проходит мимо нас вниз:
return getResultAndCache(methodInvocation, cacheKey);
Я никогда не получал комфортно со всей концепцией параллелизма. Я думаю, что мне нужно отметить, что метод getResultAndCache() для данного getSlowData() уже был запущен, а последующие запросы должны ждать результата.
Спасибо за любые мысли или советы!
Это интересная проблема, так что блокирование в процессе работы для того же кеш-ключа кажется мне логичным. Возможно, вы могли бы проверить подход, применяемый к аналогичным проектным проектам Spring: абстракция Spring Cache, ehcache-spring-annotations и spring-modules-cache. – samlewis
Внесите свой перехватчик с помощью одноточечного 'ConcurrentHashMap' методов, которые уже начали обработку? – condit
Спасибо за предложение, я просмотрел аннотации кэш Spring в пятницу. Я еще раз посмотрю другие проекты, чтобы увидеть, пропустил ли я что-то. Я думаю, что Весна использует волшебство, специфичное для Весны, для решения этой проблемы, это не было очевидно, глядя на их перехватчик, и тот, который он расширяет. – shawnjohnson