【问题标题】:How to force a Hystrix circuit breaker open?如何强制 Hystrix 断路器打开?
【发布时间】:2015-05-23 19:27:23
【问题描述】:

我想以编程方式强制断路器为特定组打开。我想我可以通过在组中的命令上设置配置以强制打开并运行该命令来做到这一点。但是,这似乎不起作用。这可能吗?我应该采取不同的方法吗?这是我在第二次 assertEquals 调用中失败的测试。

import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.HystrixCommandProperties;
import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class ForceCircuitBreakerCommandTest {

    @Test
    public void testForceOpen(){

        assertEquals(Boolean.TRUE, new FakeCommand().execute());

        new OpenCircuitBreakerCommand().execute();

        assertEquals(Boolean.FALSE, new FakeCommand().execute());

    }

    private class FakeCommand extends HystrixCommand<Boolean> {

        public FakeCommand(){
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("TestGroup")));
        }

        @Override
        public Boolean run(){return Boolean.TRUE;}

        @Override
        public Boolean getFallback() {return Boolean.FALSE;}
    }

    private class OpenCircuitBreakerCommand extends HystrixCommand<Boolean> {

        public OpenCircuitBreakerCommand(){
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("TestGroup"))
                    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                                    .withCircuitBreakerForceOpen(true)));
        }

        @Override
        public Boolean run(){return Boolean.TRUE;}

        @Override
        public Boolean getFallback() {return Boolean.FALSE;}
    }
}

【问题讨论】:

    标签: java hystrix circuit-breaker


    【解决方案1】:

    我已经使用

    设置了自定义属性,例如 "hystrix.command.HystrixCommandKey.circuitBreaker.forceOpen"
    import com.netflix.config.ConfigurationManager;
    
    ConfigurationManager.getConfigInstance()
        .setProperty("hystrix.command.HystrixCommandKey.circuitBreaker.forceOpen",
        true);
    

    ConfigurationManager 是内部使用的 Archaius 实例。

    【讨论】:

      【解决方案2】:

      这是使用Senthilkumar Gopal 的答案对测试的编辑

      @Test
      public void testForceOpen() {
      
          assertEquals(Boolean.TRUE, new OpenCircuitBreakerCommand().execute());
      
          ConfigurationManager.getConfigInstance()
                  .setProperty("hystrix.command.OpenCircuitBreakerCommand.circuitBreaker.forceOpen",
                          true);
      
          assertEquals(Boolean.FALSE, new OpenCircuitBreakerCommand().execute());
      }
      

      【讨论】:

      • 请提供上下文、您编辑的内容以及原因
      【解决方案3】:

      您不一定非要使用ConfigurationManager。该测试需要说明:

      @Test
      public void testForceOpen() {
          assertEquals(Boolean.TRUE, new FakeCommand().execute());
          assertEquals(Boolean.FALSE, new OpenCircuitBreakerCommand().execute());
      }
      

      【讨论】:

        猜你喜欢
        • 2020-10-29
        • 2023-03-09
        • 2019-07-05
        • 2018-07-09
        • 2016-12-11
        • 2016-08-06
        • 2018-10-05
        • 2019-06-27
        • 2015-12-06
        相关资源
        最近更新 更多