Code

  1. /**
  2. * @author luobo.cs@raycloud.com
  3. * @since 2020/8/2 3:49 下午
  4. */
  5. public class TimeOutCommand extends HystrixCommand<Boolean> {
  6. final Logger log = LoggerFactory.getLogger(this.getClass());
  7. private final DbConfig dbConfig;
  8. public TimeOutCommand(DbConfig dbConfig) {
  9. super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("fast-timeout"))
  10. .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey(dbConfig.getName()))
  11. .andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(10000).withExecutionTimeoutEnabled(true))
  12. .andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter().withMaxQueueSize(300).withCoreSize(10)));
  13. this.dbConfig = dbConfig;
  14. }
  15. @Override
  16. protected Boolean run() {
  17. try {
  18. DBUtils.testConn(dbConfig);
  19. return Boolean.TRUE;
  20. } catch (Exception e) {
  21. log.error("[TimeOutCommand][error:{}]", e.getMessage(), e);
  22. return Boolean.FALSE;
  23. }
  24. }
  25. @Override
  26. protected Boolean getFallback() {
  27. log.error("出现降级 GG:{}", JSONObject.toJSONString(dbConfig));
  28. return Boolean.FALSE;
  29. }
  30. }

使用

  1. TimeOutCommand timeOutCommand = new TimeOutCommand(config);
  2. //这里的使用根据实际情况使用,例如有的场景需要同步,有的场景需要异步
  3. //同步execute 异步 observe
  4. final Boolean execute = timeOutCommand.execute();
  5. //异步
  6. Observable<Response<String>> observe = timeOutCommand.observe();
  7. observe.subscribe(new Observer<Response<String>>() {
  8. @Override
  9. public void onCompleted() {
  10. //没有什么东西
  11. }
  12. @Override
  13. public void onError(Throwable e) {
  14. //这里可无视
  15. }
  16. @Override
  17. public void onNext(Response<String> response) {
  18. //降级或者不降级都会走这里
  19. if (response.getSuccess()) {
  20. try {
  21. TOMCAT_STATUS.put(tomcat.getTomcatId(), response.getBody().split("\\t")[2]);
  22. } catch (Exception e) {
  23. TOMCAT_STATUS.put(tomcat.getTomcatId(), e.getMessage());
  24. }
  25. } else {
  26. TOMCAT_STATUS.put(tomcat.getTomcatId(), response.getErrorMsg());
  27. }
  28. }
  29. });

——————————
2021-01-06

对于豪猪的不了解,导致设置的有问题

  1. .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey(dbConfig.getName()))

这里会为每一个 dbConfig.getName 都生成一个线程池,所以随着name的增加,线程开始💥 爆炸。 这里需要明确是否要隔离. 例如我只想要的功能只要一个线程池就够了