grzzly FileChain处理说明


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; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值