From 449b632e81fe305809e41f3810e73a61a313be7e Mon Sep 17 00:00:00 2001 From: Marti Date: Fri, 8 Mar 2019 16:08:44 +0100 Subject: [PATCH] interoperable - framework changes --- .../util/CustomFeignClientsConfiguration.java | 103 +++++++++++------- 1 file changed, 62 insertions(+), 41 deletions(-) diff --git a/src/main/java/org/apache/fineract/cn/api/util/CustomFeignClientsConfiguration.java b/src/main/java/org/apache/fineract/cn/api/util/CustomFeignClientsConfiguration.java index d8e4b60..6de0944 100644 --- a/src/main/java/org/apache/fineract/cn/api/util/CustomFeignClientsConfiguration.java +++ b/src/main/java/org/apache/fineract/cn/api/util/CustomFeignClientsConfiguration.java @@ -18,6 +18,7 @@ */ package org.apache.fineract.cn.api.util; +import com.netflix.hystrix.strategy.HystrixPlugins; import feign.Feign; import feign.Target; import feign.codec.Decoder; @@ -29,64 +30,84 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.netflix.feign.FeignClientsConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Scope; +import javax.annotation.PostConstruct; +import java.util.ArrayList; +import java.util.List; + /** * @author Myrle Krantz */ //@EnableApiFactory (for logger) @SuppressWarnings({"unused"}) +@ConditionalOnProperty(value = "hystrix.wrappers.enabled", matchIfMissing = true) public class CustomFeignClientsConfiguration extends FeignClientsConfiguration { - private static class AnnotatedErrorDecoderFeignBuilder extends Feign.Builder { - private final Logger logger; - AnnotatedErrorDecoderFeignBuilder(final Logger logger) { - this.logger = logger; + public static final Logger logger = LoggerFactory.getLogger(CustomFeignClientsConfiguration.class.getName()); + + private static class AnnotatedErrorDecoderFeignBuilder extends Feign.Builder { + private final Logger logger; + + AnnotatedErrorDecoderFeignBuilder(final Logger logger) { + this.logger = logger; + } + + public T target(Target target) { + this.errorDecoder(new AnnotatedErrorDecoder(logger, target.type())); + return build().newInstance(target); + } } - public T target(Target target) { - this.errorDecoder(new AnnotatedErrorDecoder(logger, target.type())); - return build().newInstance(target); + @Bean + @ConditionalOnMissingBean + public TenantedTargetInterceptor tenantedTargetInterceptor() { + return new TenantedTargetInterceptor(); } - } - @Bean - @ConditionalOnMissingBean - public TenantedTargetInterceptor tenantedTargetInterceptor() - { - return new TenantedTargetInterceptor(); - } + @Bean + @ConditionalOnMissingBean + public TokenedTargetInterceptor tokenedTargetInterceptor() { + return new TokenedTargetInterceptor(); + } - @Bean - @ConditionalOnMissingBean - public TokenedTargetInterceptor tokenedTargetInterceptor() - { - return new TokenedTargetInterceptor(); - } + @Bean + @ConditionalOnMissingBean + public Decoder feignDecoder() { + return new GsonDecoder(); + } - @Bean - @ConditionalOnMissingBean - public Decoder feignDecoder() { - return new GsonDecoder(); - } + @Bean + @ConditionalOnMissingBean + public Encoder feignEncoder() { + return new GsonEncoder(); + } - @Bean - @ConditionalOnMissingBean - public Encoder feignEncoder() { - return new GsonEncoder(); - } + @Bean(name = ApiConfiguration.LOGGER_NAME) + public Logger logger() { + return LoggerFactory.getLogger(ApiConfiguration.LOGGER_NAME); + } - @Bean(name = ApiConfiguration.LOGGER_NAME) - public Logger logger() { - return LoggerFactory.getLogger(ApiConfiguration.LOGGER_NAME); - } + @Bean + @Scope("prototype") + @ConditionalOnMissingBean + public Feign.Builder feignBuilder(@Qualifier(ApiConfiguration.LOGGER_NAME) final Logger logger) { + return new AnnotatedErrorDecoderFeignBuilder(logger); + } - @Bean - @Scope("prototype") - @ConditionalOnMissingBean - public Feign.Builder feignBuilder(@Qualifier(ApiConfiguration.LOGGER_NAME) final Logger logger) { - return new AnnotatedErrorDecoderFeignBuilder(logger); - } -} \ No newline at end of file + @PostConstruct + public void configureHystrixConcurrencyStrategy() { + List wrappers = new ArrayList<>(); + wrappers.add(new ThreadLocalAwareCallableWrapper()); + HystrixPlugins instance = HystrixPlugins.getInstance(); + try { + instance.registerConcurrencyStrategy( + new HystrixContextAwareConcurrencyStrategy(wrappers)); + } catch(IllegalStateException e) { + logger.warn("Another concurrency strategy is already registered in hystrix!"); + } + } +}