From fc70fad3cf843e6d2523c38fdd65fc48037f5fb6 Mon Sep 17 00:00:00 2001
From: 101captain <237651143@qq.com>
Date: 星期一, 22 八月 2022 15:41:12 +0800
Subject: [PATCH] bug修改
---
springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/FeignHystrixConcurrencyStrategy.java | 128 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 128 insertions(+), 0 deletions(-)
diff --git a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/FeignHystrixConcurrencyStrategy.java b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/FeignHystrixConcurrencyStrategy.java
new file mode 100644
index 0000000..3b145f9
--- /dev/null
+++ b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/FeignHystrixConcurrencyStrategy.java
@@ -0,0 +1,128 @@
+package com.panzhihua.common.utlis;
+
+import com.netflix.hystrix.HystrixThreadPoolKey;
+import com.netflix.hystrix.HystrixThreadPoolProperties;
+import com.netflix.hystrix.strategy.HystrixPlugins;
+import com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategy;
+import com.netflix.hystrix.strategy.concurrency.HystrixRequestVariable;
+import com.netflix.hystrix.strategy.concurrency.HystrixRequestVariableLifecycle;
+import com.netflix.hystrix.strategy.eventnotifier.HystrixEventNotifier;
+import com.netflix.hystrix.strategy.executionhook.HystrixCommandExecutionHook;
+import com.netflix.hystrix.strategy.metrics.HystrixMetricsPublisher;
+import com.netflix.hystrix.strategy.properties.HystrixPropertiesStrategy;
+import com.netflix.hystrix.strategy.properties.HystrixProperty;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class FeignHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy {
+
+ private static final Logger log = LoggerFactory.getLogger(FeignHystrixConcurrencyStrategy.class);
+
+ private HystrixConcurrencyStrategy delegate;
+
+ public FeignHystrixConcurrencyStrategy() {
+ try {
+ this.delegate = HystrixPlugins.getInstance().getConcurrencyStrategy();
+ if (this.delegate instanceof FeignHystrixConcurrencyStrategy) {
+ // Welcome to singleton hell...
+ return;
+ }
+ HystrixCommandExecutionHook commandExecutionHook = HystrixPlugins
+ .getInstance().getCommandExecutionHook();
+ HystrixEventNotifier eventNotifier = HystrixPlugins.getInstance()
+ .getEventNotifier();
+ HystrixMetricsPublisher metricsPublisher = HystrixPlugins.getInstance()
+ .getMetricsPublisher();
+ HystrixPropertiesStrategy propertiesStrategy = HystrixPlugins.getInstance()
+ .getPropertiesStrategy();
+ this.logCurrentStateOfHystrixPlugins(eventNotifier, metricsPublisher,
+ propertiesStrategy);
+ HystrixPlugins.reset();
+ HystrixPlugins.getInstance().registerConcurrencyStrategy(this);
+ HystrixPlugins.getInstance()
+ .registerCommandExecutionHook(commandExecutionHook);
+ HystrixPlugins.getInstance().registerEventNotifier(eventNotifier);
+ HystrixPlugins.getInstance().registerMetricsPublisher(metricsPublisher);
+ HystrixPlugins.getInstance().registerPropertiesStrategy(propertiesStrategy);
+ }
+ catch (Exception e) {
+ log.error("Failed to register Sleuth Hystrix Concurrency Strategy", e);
+ }
+ }
+
+ private void logCurrentStateOfHystrixPlugins(HystrixEventNotifier eventNotifier,
+ HystrixMetricsPublisher metricsPublisher,
+ HystrixPropertiesStrategy propertiesStrategy) {
+ if (log.isDebugEnabled()) {
+ log.debug("Current Hystrix plugins configuration is ["
+ + "concurrencyStrategy [" + this.delegate + "]," + "eventNotifier ["
+ + eventNotifier + "]," + "metricPublisher [" + metricsPublisher + "],"
+ + "propertiesStrategy [" + propertiesStrategy + "]," + "]");
+ log.debug("Registering Sleuth Hystrix Concurrency Strategy.");
+ }
+ }
+
+ @Override
+ public <T> Callable<T> wrapCallable(Callable<T> callable) {
+ RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
+ return new WrappedCallable<>(callable, requestAttributes);
+ }
+
+ @Override
+ public ThreadPoolExecutor getThreadPool(HystrixThreadPoolKey threadPoolKey,
+ HystrixProperty<Integer> corePoolSize,
+ HystrixProperty<Integer> maximumPoolSize,
+ HystrixProperty<Integer> keepAliveTime, TimeUnit unit,
+ BlockingQueue<Runnable> workQueue) {
+ return this.delegate.getThreadPool(threadPoolKey, corePoolSize, maximumPoolSize,
+ keepAliveTime, unit, workQueue);
+ }
+
+ @Override
+ public ThreadPoolExecutor getThreadPool(HystrixThreadPoolKey threadPoolKey,
+ HystrixThreadPoolProperties threadPoolProperties) {
+ return this.delegate.getThreadPool(threadPoolKey, threadPoolProperties);
+ }
+
+ @Override
+ public BlockingQueue<Runnable> getBlockingQueue(int maxQueueSize) {
+ return this.delegate.getBlockingQueue(maxQueueSize);
+ }
+
+ @Override
+ public <T> HystrixRequestVariable<T> getRequestVariable(
+ HystrixRequestVariableLifecycle<T> rv) {
+ return this.delegate.getRequestVariable(rv);
+ }
+
+ static class WrappedCallable<T> implements Callable<T> {
+
+ private final Callable<T> target;
+ private final RequestAttributes requestAttributes;
+
+ public WrappedCallable(Callable<T> target, RequestAttributes requestAttributes) {
+ this.target = target;
+ this.requestAttributes = requestAttributes;
+ }
+
+ @Override
+ public T call() throws Exception {
+ try {
+ RequestContextHolder.setRequestAttributes(requestAttributes);
+ return target.call();
+ }
+ finally {
+ RequestContextHolder.resetRequestAttributes();
+ }
+ }
+ }
+}
--
Gitblit v1.7.1