0

HystrixBadRequestException特に検証の分野で、Hystrix が非障害エラーと でどのように機能するかを理解しようとしています。すべての Bean に JSR-303 Bean 検証 (Hibernate バリデーター) を使用します。

public class User {
    @Min(1L)
    private Long id;

    @NotNull
    @Email      
    private String email;
}

public class UserValidator {
    private Validator validator;

    // Throw exception if the user is invalid; return void otherwise.
    public void validateUser(User user) {
        Set<ConstraintViolation<User>> violations = validator.validate(user);
        if(!violations.isEmpty()) {
            return new BadEntityException(violations);
        }
    }
}

// Hystrix command.
public class SaveUserCommand extends HystrixCommand<User> {
    public User user;

    public void doSaveUser(User user) {
        this.user = user;
        execute();
    }

    @Override
    protected User run() {
        // Save 'user' somehow
    }

    @Override
    protected User getFallback() {
        return null;
    }
}

// My service client that uses my Hystrix command.
public class UserClient {
    private SaveUserCommandFactory factory = new SaveUserCommandFactory();
    private UserValidator validator = new UserValidator();

    public User saveUser(User user) {
        SaveUserCommand saveUserCommand = factory.newSaveUserCommand();
        validator.validate(user);
        user = saveUserCommand.doSaveUser(user);

        return user;
    }
}

これは機能するはずですが、 はこの目的のために作成されたように感じHystrixBadRequestExceptionます。どういうわけか、コマンドの外側ではなくコマンドのvalidator 内側に配置できます。ドキュメントによると、この例外は、不正な引数を含む非障害例外を対象としていました。検証をコマンド内に配置してそれを活用する方法がわかりません(失敗した検証がメトリック/統計にカウントされないように)。

4

1 に答える 1

2

implのHystrixBadRequestException 内部にスローする必要があることがわかりました。HystrixCommand私の場合、解決策はバリデーターをSaveUserCommand#run()メソッドに移動することでした:

@Override
protected void run() {
    try {
        validator.validate(user);
        // Save user somehow
    } catch(BadEntityException bexc) {
        log.error(bexc);
        throw new HystrixBadRequestException("Hystrix caught a bad request.", bexc);
    }
}

現在、検証が失敗した場合、外側の例外は aHystrixBadRequestExceptionであり、サーキット ブレーカーの統計または公開されたメトリックに対してカウントされません。

于 2014-11-29T19:19:36.120 に答える