If a method marked @Cacheable takes 10 minutes to complete and two threads t1,t2 access the method.
t1 accesses at time 0 (cache method is now run for first time) t2 accesses at time t1+5mins
Does this mean that t2 will not access the data for approx 5 mins since t1 has already started the @Cacheable operation and it's due to complete in 5 mins(as its been running for 5 mins) or will a new call to @Cacheable be invoked by t2?
Since Spring 4.3, you can get the desired blocking behavior by adding the sync = true flag:
@Cacheable(value="cacheName", key="{#keyField1, #keyField2}", sync = true)
If the result of the first execution hasn't been cached, the second invocation will proceed.
You should understand that @Cacheable is centered around the content of the cache (and not specifically a thread's execution context [well, kind of; the cache still needs to be threadsafe]). On execution of a method, the cache is first checked to see if the key exists: if t1 is taking a while to complete, its result will not be cached therefore, concurrent executions will proceed without regard for t1's execution
There is no blocking on @Cacheable.
But you can use blocking cache strategy in cache implementation. First query found miss has the responsibility to rebuild the cache. Others queries wait until the cache is rebuilt.
ReadWriteLock. See the net.sf.ehcache.constructs.blocking.BlockingCache.As colossus explained, the cache is checked prior to the method call. So, if the item is not in cache (as will be the case at t1 + 5 mins), the method invocation will happen for thread t2 as well.
There is no "blocking" on the @Cacheable annotation. t2 will call the method as if there was a cache-miss and hence t2 will also take 10 minutes to complete the same method.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With