- gPRC 介绍
- gPRC 介绍 - 资料收集整理
- gPRC 介绍 - Protocol Buffer 3
- gPRC文档
- gPRC文档 - gRPC官方文档(中文版)
- gPRC文档 - gRPC动机和设计原则
- gPRC文档 - 源码导航
- 基础 - NameResolver
- NameResolver - URI术语
- NameResolver - 类NameResolver
- NameResolver - 类DnsNameResolver
- NameResolver - 类DirectAddressNameResolver
- NameResolver - NameResolver的用法
- 基础 - Metadata
- Channel层
- Channel设计与代码实现 - 类Channel
- Channel设计与代码实现 - 类ManagedChannel
- 类ManagedChannelImpl - 空闲模式
- 类ManagedChannelImpl - InUseStateAggregator
- 类ManagedChannelImpl - Name Resolver
- 类ManagedChannelImpl - Load Balancer
- 类ManagedChannelImpl - Transport
- 类ManagedChannelImpl - Executor
- 类ManagedChannelImpl - 关闭
- Channel层 - Channel Builder设计与代码实现
- Channel Builder设计与代码实现 - 类ManagedChannelBuilder
- Channel Builder设计与代码实现 - 类AbstractManagedChannelImplBuilder
- Channel Builder设计与代码实现 - 类NettyChannelBuilder
- Channel层 - Channel Provider设计与代码实现
- Channel Provider设计与代码实现 - 类ManagedChannelProvider
- Channel Provider设计与代码实现 - 类NettyChannelProvider
- Channel层 - 类CallOptions
- Stub层 - 类DemoServiceBlockingStub
- Stub层 - 类AbstractStub
- 客户端流程
- 状态 - 类Status
- 状态 - 状态码详细定义
- 状态 - 类StatusException
- 状态 - 异常处理的流程分析
- 实践 - 集成Spring Boot
- 实践 - 文档生成
- 文档生成 - 支持proto3
- 文档生成 - build插件
- 文档生成 - 使用模板定制输出
- 实践 - 代理
- 实践 - 超时
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
类ManagedChannelImpl - InUseStateAggregator
上一节发现空闲模式的进入和退出是由 InUseStateAggregator 来进行控制的,继续看 InUseStateAggregator 是如何工作的。
类InUseStateAggregator
InUseStateAggregator,字面意思是”正在使用的状态聚合器”,javadoc如此描述:
Aggregates the in-use state of a set of objects.
聚合一个对象集合的正在使用的状态
这是一个grpc的内部抽象类:
package io.grpc.internal;
abstract class InUseStateAggregator<T> {}
实现原理
类InUseStateAggregator的实现原理很直白,就是每个要使用这个聚合器的调用者都要存进来一个对象(就是范型T),然后用完之后再取出来,这样就可以通过保存对象的数量变化判断开始使用(从无到有)或者已经不再使用(从有到无):
private final HashSet<T> inUseObjects = new HashSet<T>();
final void updateObjectInUse(T object, boolean inUse) {
synchronized (getLock()) {
// 记录更新前的原始数量
int origSize = inUseObjects.size();
if (inUse) {
// inUse为true,表示增加正在使用的状态,保存对象
inUseObjects.add(object);
if (origSize == 0) {
// 如果原始数量为0,表示从无到有,此时回调抽象方法 handleInUse()
handleInUse();
}
} else {
// inUse为false,表示检查正在使用的状态,删除对象
boolean removed = inUseObjects.remove(object);
if (removed && origSize == 1) {
// 如果删除成功并且原始使用为1,表示从有到无,此时回调抽象方法 handleNotInUse()
handleNotInUse();
}
}
}
}
isInUse() 函数通过检查是否有保存的对象来判断是否正在使用:
final boolean isInUse() {
synchronized (getLock()) {
return !inUseObjects.isEmpty();
}
}
状态变更回调
当状态变更时,回调这两个抽象方法:
handleInUse(): 当被聚合的使用中的状态被修改为 true 时调用,这意味着至少一个对象正在使用中。
abstract void handleInUse();
handleNotInUse(): 当被聚合的使用中的状态被修改为 false 时调用,这意味着没有对象正在使用中。
abstract void handleNotInUse();
ManagedChannelImpl中的实现
回顾 InUseStateAggregator 定义
回顾 ManagedChannelImpl 中对 inUseStateAggregator 的定义:
final InUseStateAggregator<Object> inUseStateAggregator =
new InUseStateAggregator<Object>() {
......
void handleInUse() {
// 当状态变更为使用中时,退出空闲模式
exitIdleMode();
}
void handleNotInUse() {
// 当状态变更为没有人使用时,重新安排空闲timer以便在稍后进入空闲模式
rescheduleIdleTimer();
}
};
调用 InUseStateAggregator
在ManagedChannelImpl中,当 transport 状态变更时就会调用 InUseStateAggregator:
final TransportManager<ClientTransport> tm = new TransportManager<ClientTransport>() {
......
ts = new TransportSet(......, new TransportSet.Callback() {
......
public void onInUse(TransportSet ts) {
// 当 transportset 的状态变更为 InUse 时
inUseStateAggregator.updateObjectInUse(ts, true);
}
public void onNotInUse(TransportSet ts) {
// 当 transportset 的状态变更为 NotInUse 时
inUseStateAggregator.updateObjectInUse(ts, false);
}
}
}
还有 InterimTransportImpl:
private class InterimTransportImpl implements InterimTransport<ClientTransport> {
public void transportTerminated() {
......
inUseStateAggregator.updateObjectInUse(delayedTransport, false);
}
@Override public void transportInUse(boolean inUse) {
inUseStateAggregator.updateObjectInUse(delayedTransport, inUse);
}
}
注: Transport 的详细内容不再继续展开了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论