Hystrix原理之核心类MetaHolder的实现
【摘要】 通过HystrixCommand的讲解,我们知道在MetaHolder中,简单地持有用于构建HystrixCommand的关于被包装方法的必要信息,如被注解的方法、失败回滚执行的方法和默认的command key等属性。@Immutablepublic final class MetaHolder { ... private final Method method; //被注解...
通过HystrixCommand的讲解,我们知道在MetaHolder
中,简单地持有用于构建HystrixCommand
的关于被包装方法的必要信息,如被注解的方法、失败回滚执行的方法和默认的command key等属性。
@Immutable
public final class MetaHolder {
...
private final Method method; //被注解的方法
private final Method cacheKeyMethod;
private final Method ajcMethod;
private final Method fallbackMethod; // 失败回滚执行的方法
...
private final String defaultGroupKey; // 默认的group key
private final String defaultCommandKey; // 默认的command key
private final String defaultCollapserKey; // 默认的合并请求key
private final String defaultThreadPoolKey; // 默认的线程池key
private final ExecutionType executionType; // 执行类型
...
....
}
在HystrixCommandFactory
,用于创建HystrixCommand
的方法:
public HystrixInvokable create(MetaHolder metaHolder) {
HystrixInvokable executable;
// 构建合并请求的command
if (metaHolder.isCollapserAnnotationPresent()) {
executable = new CommandCollapser(metaHolder);
} else if (metaHolder.isObservable()) {
executable = new GenericObservableCommand(HystrixCommandBuilderFactory.getInstance().create(metaHolder));
} else {
executable = new GenericCommand(HystrixCommandBuilderFactory.getInstance().create(metaHolder));
}
return executable;
}
需要应该注意的是metaHolder.isObservable()
的属性的不同将会构建不同的Command(HystrixCommand
或者HystrixObservableCommand
),前者用于将命令用于同步或者异步操作,后者用于响应式操作,主要是根据被包装方法的返回值来决定Command
执行方式,主要有异步执行、同步执行、响应式执行。
//CommandMetaHolderFactory.create()
...
ExecutionType executionType = ExecutionType.getExecutionType(method.getReturnType());
...
public enum ExecutionType {
// 异步执行命令
ASYNCHRONOUS,
// 同步执行命令
SYNCHRONOUS,
// 响应式执行命令(异步回调)
OBSERVABLE;
private static final Set<? extends Class> RX_TYPES = ImmutableSet.of(Observable.class, Single.class, Completable.class);
// 根据方法的返回类型返回对应的ExecutionType
public static ExecutionType getExecutionType(Class<?> type) {
// Future 为异步执行
if (Future.class.isAssignableFrom(type)) {
return ExecutionType.ASYNCHRONOUS;
} else if (isRxType(type)) {
// 属于 rxType为异步回调执行
return ExecutionType.OBSERVABLE;
} else {
// 其他为同步执行
return ExecutionType.SYNCHRONOUS;
}
}
private static boolean isRxType(Class<?> cl) {
for (Class<?> rxType : RX_TYPES) {
if (rxType.isAssignableFrom(cl)) {
return true;
}
}
return false;
}
}
根据被包装方法的返回值类型决定命令执行的ExecutionType
,从而决定构建HystrixCommand
还是HystrixObservableCommand
。其中Future
类型的返回值将会被异步执行,rx
类型的返回值将会被异步回调执行,其他的类型将会被同步执行。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)