2

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 で失敗すること、および実行が成功した後、指定された期間ストールすることを確認しています。デバッグ ステートメントは、回線が決して閉じられていないことを示していますが、最初の呼び出しの後で例外がスローされ、失敗を示しているため、最初の呼び出しの後に閉じる必要があります。誰か助けてくれませんか?

4

0 に答える 0