2016-09-07 5 views
3

В приложении Spring (не Spring-boot) я использую аннотацию javanica @HystrixCommand и весенний кеш @Cacheable аннотации по одному и тому же методу bean, Spring выполняет совет кэша перед Гистрикс. Это то, чего я жду, но для меня советы по кешу и советы по гистерезре без какой-либо конфигурации имеют весной такой же порядок: LOWEST_PRECEDENCE.javanica @HystrixCommand и spring @Cacheable порядок выполнения

Я не знаю, что делает этот заказ: он определен где-то или это неопределенный порядок, и мне повезло, что у меня хороший порядок? Что должно быть сделано, чтобы гарантировать, что рекомендации кэша будет выполняться перед советом Hystrix (набор заказов на кэш: аннотацию приводом перед тем LOWEST_PRECEDENCE?)

Это пример моего кода:

... 
import org.springframework.cache.annotation.CacheConfig; 

import org.springframework.cache.annotation.Cacheable; 
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; 
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty; 
... 


@Service 
@Slf4j 
@CacheConfig(cacheManager="myCacheManager") 
public class MyRessourcesImpl implements MyRessources { 
... 
    @Override 
    @HystrixCommand(commandProperties = { 
      @HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE"), 
      @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "10000") }) 
    @Cacheable("cacheName") //from spring cache 
    public Map<String, String> getTheMap() { 
     ... 
    } 
...  
} 

С этим весна конфигурации:

<bean id="myCache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" > 
    <property name="configLocation" value="classpath:/META-INF/...." /> 
</bean> 

<bean id="myCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> 
    <property name="cacheManager" ref="myCache" /> 
</bean> 

<cache:annotation-driven cache-manager="myCacheManager" /> 

<aop:aspectj-autoproxy/> 

<bean id="hystrixAspect" class="com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect" /> 

Спасибо за помощь

+0

Попробуйте [CTRL] + [SPACE] (код завершения) на любом '<кэша: аннотаций приводом />' или '' ... Найдите свойство заказа, установите его в том порядке, в котором вы хотите. –

+1

Если совет по кэшу выполняется до того, как советует Hystrix, это означает, что вы можете кэшировать резервные результаты. Я думаю, вы, вероятно, этого не хотите. –

ответ

1

According to the docs, если не указать порядок, то U ndefined:

Если два совета, определенные в разных аспектах, оба должны выполняться в одной и той же точке соединения, если вы не указали иначе, порядок выполнения не определен. Вы можете контролировать порядок выполнения, указав приоритет. Это делается обычным способом Spring путем реализации интерфейса org.springframework.core.Ordered в классе аспектов или аннотации его с помощью аннотации Order. Учитывая два аспекта, аспект, возвращающий более низкое значение из Ordered.getValue() (или значение аннотации), имеет более высокий приоритет.

Кредит: spring annotation advice order