2015-06-22 2 views
1

Я использую groovy для обработки пакетного задания, я планирую кэшировать объект домена с помощью аннотации @Memoize от groovy, но проблема в истечении срока действия, я хочу истечь кеш, когда работа закончен. Есть ли способ сказать groovy, чтобы истечь кеш из кода?Groovy @Memoize expiry на основе пользовательского события

+1

Довольно верный ответ не –

+0

Правильный ответ: Спасибо Тиму, я был под тем же впечатлением, но мне хотелось перекреститься с таким поднятым вопросом здесь, после нескольких дней ожидания придет к выводу, что нет никакого способа. Я не уверен, как я могу пометить ваш комментарий правильно. –

ответ

1

Согласно the docs, @Memoized имеет только максимальное значение и параметры размера кеша защиты.

Поскольку AST под крышки будет создан механизм memoize через Closure::memoize, вы можете эмулировать с картой и memoized затворов, которые могут быть утилизированы:

class Job { 
    def log = [] 
    def repoBase = [ 
     sum: { a, b -> 
      log << "sum $a and $b" 
      a + b 
     }, 
     multiply: { a, b -> 
      log << "multiply $a and $b" 
     } 
    ] 

    def repo 

    def startJob() { 
     repo = repoBase.collectEntries { key, value -> 
      [(key): value.memoize()] 
     } as Expando 
    } 

    def withJob(Closure c) { 
     startJob() 
     c.delegate = repo 
     c.delegateStrategy = Closure.DELEGATE_FIRST 
     c(this) 
     repo = null 
    } 

} 

И тест:

j = new Job() 

j.withJob { 
    multiply 3, 4 
    multiply 3, 4 
    multiply 8, 8 
    sum 9, 9 
    sum 1, 2 
    sum 9, 9 
} 

assert j.log == [ 
    "multiply 3 and 4", 
    "multiply 8 and 8", 
    "sum 9 and 9", 
    "sum 1 and 2" 
] 
+1

Или используйте гуаву. https://github.com/google/guava/wiki/CachesExplained –

Смежные вопросы