Hystrix断路器不会打开?

时间:2016-07-06 03:47:22

标签: java hystrix circuit-breaker

我正在尝试学习如何使用Hystrix。我在下面创建了这个类:

public class CommandReturnAllExceptFive extends HystrixCommand<Integer> {
    public static final Integer SLEEP_TIME = 5000;

    private Integer x;

    public CommandReturnAllExceptFive(Integer x) {
        super(getHystrixConfiguration());
        this.x = x;
        System.out.println("Is circuit breaker open? " + (this.circuitBreaker.isOpen() ? "yes" : "no"));
        System.out.println("Requests so far: "+(this.metrics.getRollingCount(HystrixEventType.FAILURE)));
    }

    public void setX(Integer x) {
        this.x = x;
    }

    private static HystrixCommand.Setter getHystrixConfiguration() {
        HystrixCommandProperties.Setter properties
                = HystrixCommandProperties.Setter()
                .withCircuitBreakerSleepWindowInMilliseconds(SLEEP_TIME)
                .withCircuitBreakerEnabled(true)
                .withCircuitBreakerRequestVolumeThreshold(1)
                .withCircuitBreakerErrorThresholdPercentage(1)
                .withMetricsRollingStatisticalWindowBuckets(1)
                .withMetricsRollingStatisticalWindowBuckets(1);
        HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory.asKey("ReturnAllExceptFive");
        return HystrixCommand.Setter.withGroupKey(groupKey).andCommandPropertiesDefaults(properties);
    }
    protected Integer run() throws Exception {
        if (x == 5) {
            throw new Exception();
        }

        return x;
    }
}

进行以下单元测试:

   @Test
    public void testCommandReturnAllExceptFive_doesStallBeforeCallingAgain() {
        boolean exceptionIsThrown = false;
        try {
            CommandReturnAllExceptFive returnAllExceptFive = new CommandReturnAllExceptFive(5);
            returnAllExceptFive.execute();
        } catch (Exception ex) {
            exceptionIsThrown = true;
        }
        assertThat(exceptionIsThrown, is(true));

        long timeNow = System.currentTimeMillis();

        boolean callIsSuccessful = false;
        while (!callIsSuccessful) {
            try {
                CommandReturnAllExceptFive returnAllExceptFive = new CommandReturnAllExceptFive(1);
                returnAllExceptFive.execute();
                callIsSuccessful = true;
            } catch (Exception ex) {

            }
        }
        long timeAfter = System.currentTimeMillis();

        long timeToSuccess = timeAfter - timeNow;
        System.out.println("timeNow: "+timeNow+"\ntimeAfter: "+timeAfter);
        //assertThat(timeToSuccess >= CommandReturnAllExceptFive.SLEEP_TIME, is(true));
    }

基本上验证调用在5处失败,并且在成功执行后它在指定的时间段内停顿。调试语句表明电路永远不会关闭,但应该在第一次调用后关闭,因为那个引发异常,因此表示失败。任何人都可以帮助我吗?

0 个答案:

没有答案