diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerFeignClientAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerFeignClientAutoConfiguration.java index 05c20d052..b9827370f 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerFeignClientAutoConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerFeignClientAutoConfiguration.java @@ -18,9 +18,11 @@ package com.tencent.cloud.polaris.circuitbreaker.config; import com.tencent.cloud.polaris.circuitbreaker.feign.PolarisCircuitBreakerNameResolver; +import com.tencent.cloud.polaris.circuitbreaker.feign.PolarisFeignCircuitBreaker; import com.tencent.cloud.polaris.circuitbreaker.feign.PolarisFeignCircuitBreakerTargeter; import feign.Feign; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory; @@ -29,6 +31,7 @@ import org.springframework.cloud.openfeign.FeignClientFactoryBean; import org.springframework.cloud.openfeign.Targeter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; /** * PolarisCircuitBreakerFeignClientAutoConfiguration. @@ -47,8 +50,16 @@ public class PolarisCircuitBreakerFeignClientAutoConfiguration { } @Bean + @ConditionalOnBean(CircuitBreakerFactory.class) public Targeter polarisFeignCircuitBreakerTargeter(CircuitBreakerFactory circuitBreakerFactory, CircuitBreakerNameResolver circuitBreakerNameResolver) { return new PolarisFeignCircuitBreakerTargeter(circuitBreakerFactory, circuitBreakerNameResolver); } + @Bean + @Scope("prototype") + @ConditionalOnBean(CircuitBreakerFactory.class) + public Feign.Builder circuitBreakerFeignBuilder() { + return PolarisFeignCircuitBreaker.builder(); + } + } diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/PolarisFeignCircuitBreaker.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/PolarisFeignCircuitBreaker.java index 36f438234..43fdb3b36 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/PolarisFeignCircuitBreaker.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/PolarisFeignCircuitBreaker.java @@ -16,8 +16,8 @@ public class PolarisFeignCircuitBreaker { /** * @return builder for Feign CircuitBreaker integration */ - public static PolarisFeignCircuitBreaker.Builder builder(Feign.Builder delegateBuilder) { - return new PolarisFeignCircuitBreaker.Builder(delegateBuilder); + public static PolarisFeignCircuitBreaker.Builder builder() { + return new PolarisFeignCircuitBreaker.Builder(); } /** @@ -25,10 +25,7 @@ public class PolarisFeignCircuitBreaker { */ public static final class Builder extends Feign.Builder { - private final Feign.Builder delegateBuilder; - - public Builder(Feign.Builder delegateBuilder) { - this.delegateBuilder = delegateBuilder; + public Builder() { } private CircuitBreakerFactory circuitBreakerFactory; @@ -66,9 +63,9 @@ public class PolarisFeignCircuitBreaker { } public Feign build(final FallbackFactory nullableFallbackFactory) { - delegateBuilder.invocationHandlerFactory((target, dispatch) -> new PolarisFeignCircuitBreakerInvocationHandler( + this.invocationHandlerFactory((target, dispatch) -> new PolarisFeignCircuitBreakerInvocationHandler( circuitBreakerFactory, feignClientName, target, dispatch, nullableFallbackFactory, circuitBreakerNameResolver, this.decoder)); - return delegateBuilder.build(); + return this.build(); } } diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/PolarisFeignCircuitBreakerTargeter.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/PolarisFeignCircuitBreakerTargeter.java index 238f37bfb..26fadd4dd 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/PolarisFeignCircuitBreakerTargeter.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/PolarisFeignCircuitBreakerTargeter.java @@ -26,10 +26,10 @@ public class PolarisFeignCircuitBreakerTargeter implements Targeter { @Override public T target(FeignClientFactoryBean factory, Feign.Builder feign, FeignContext context, Target.HardCodedTarget target) { - if (!(feign instanceof FeignCircuitBreaker.Builder)) { + if (!(feign instanceof PolarisFeignCircuitBreaker.Builder)) { return feign.target(target); } - PolarisFeignCircuitBreaker.Builder builder = PolarisFeignCircuitBreaker.builder(feign); + PolarisFeignCircuitBreaker.Builder builder = (PolarisFeignCircuitBreaker.Builder) feign; String name = !StringUtils.hasText(factory.getContextId()) ? factory.getName() : factory.getContextId(); Class fallback = factory.getFallback(); if (fallback != void.class) {