DefaultFilterChain 控制一次所有filter执行一遍。
1.根据操作来选择是DownstreamExecutor,还是UpstreamExecutor,控制执行Filter的顺序。
/**
* NONE,
* ACCEPT,
* CONNECT,
* READ,
* WRITE,
* EVENT,
* CLOSE;
*
* Filter executors array
*/
private static final ExecutorResolver[] filterExecutors = {
null,
new StaticResolver(
new UpstreamExecutor() {
@Override
public NextAction execute(Filter filter, FilterChainContext context)
throws IOException {
return filter.handleAccept(context);
}
}
),
new StaticResolver(
new UpstreamExecutor() {
@Override
public NextAction execute(Filter filter, FilterChainContext context)
throws IOException {
return filter.handleConnect(context);
}
}
),
new StaticResolver(
new UpstreamExecutor() {
@Override
public NextAction execute(Filter filter, FilterChainContext context)
throws IOException {
return filter.handleRead(context);
}
}
),
new StaticResolver(
new DownstreamExecutor() {
@Override
public NextAction execute(Filter filter, FilterChainContext context)
throws IOException {
return filter.handleWrite(context);
}
}
),
new EventResolver(),
new StaticResolver(
new UpstreamExecutor() {
@Override
public NextAction execute(Filter filter, FilterChainContext context)
throws IOException {
return filter.handleClose(context);
}
}
),
};
2.filterchain如果有reminder,还是记录在FilterStateElement,并记录当时的filterIndex,编译循环遍历所有filter后再跳转到
当时的有reminder的index(可以是多个出现这样的情况的index哦)
private <M> FiltersState storeMessage(final FilterChainContext ctx, FiltersState filtersState,
FILTER_STATE_TYPE type, final int filterIdx, final M messageToStore, final Appender<M> appender) {
if (filtersState == null) {
final Connection connection = ctx.getConnection();
filtersState = new FiltersState(size());
FILTERS_STATE_ATTR.set(connection, filtersState);
}
final Operation operation = ctx.getOperation();
filtersState.setState(operation, filterIdx, FilterStateElement.create(type, messageToStore, appender));
return filtersState;
}
3.检查Reminder,跳转,继续重新循环(从有reminder的index开始 )
FilterExecution status;
do {
status = executeChainPart(ctx, executor, ctx.getFilterIdx(), end);
if (status == FilterExecution.TERMINATE) {
return ProcessorResult.createTerminate();
} else if (status == FilterExecution.REEXECUTE) {
ctx = cloneContext(ctx);
if (checkRemainder(ctx, executor, ctx.getStartIdx(), end)) {
// if there is a remainder associated with the connection
// rerun the filter chain with the new context right away
return ProcessorResult.createRerun(ctx.internalContext);
}
// recycle cloned context
ctx.completeAndRecycle();
// reregister to listen for next operation
return ProcessorResult.createReregister();
}
} while (checkRemainder(ctx, executor, ctx.getStartIdx(), end));
protected boolean checkRemainder(FilterChainContext ctx, FilterExecutor executor, int start, int end) {
final Connection connection = ctx.getConnection();
// Take the last added remaining data info
final FiltersState filtersState = FILTERS_STATE_ATTR.get(connection);
if (filtersState == null) {
return false;
}
final int add = (end - start > 0) ? 1 : -1;
final Operation operation = ctx.getOperation();
for (int i = end - add; i != start - add; i -= add) {
final FilterStateElement element = filtersState.getState(operation, i);
if (element != null && element.getType() == FILTER_STATE_TYPE.REMAINDER) {
ctx.setFilterIdx(i);
ctx.setMessage(null);
return true;
}
}
return false;
}
grzzly FileChain处理说明
最新推荐文章于 2022-01-02 22:13:58 发布
217

被折叠的 条评论
为什么被折叠?



