6. ChannelåQ?/strong>Netty有自å·Þqš„Channel抽象åQŒå®ƒæ˜¯ä¸€ä¸ªèµ„æºçš„容器åQŒåŒ…å«äº†æ‰€æœ‰ä¸€ä¸ªè¿žæŽ¥æ¶‰åŠåˆ°çš„æ‰€æœ‰èµ„æºçš„饮用åQŒå¦‚ž®è£…NIO Channelã€ChannelPipelineã€Bossã€NioWorkerPool½{‰ã€‚å¦å¤–它˜q˜æä¾›äº†å‘内部NIO Channel写å“应数æ®çš„æŽ¥å£writeã€è¿žæŽ?¾l‘定到æŸä¸ªåœ°å€çš„connect/bind接壽{‰ï¼Œä¸ªäh感觉虽然对Channel本èínæ¥è¯´åQŒå› 为它ž®è£…了NIO ChannelåQŒå› 而这些接å£å®šä¹‰åœ¨˜q™é‡Œæ˜¯åˆç†çš„åQŒä½†æ˜¯å¦‚果考虑到Netty的架构,它的Channelåªæ˜¯ä¸€ä¸ªèµ„æºå®¹å™¨ï¼Œæœ‰è¿™ä¸ªChannel实例ž®±å¯ä»¥å¾—到和它相关的基本所有资æºï¼Œå› 而这¿Uwriteã€connectã€bind动作ä¸åº”该å†ç”±å®ƒè´Ÿè´£åQŒè€Œæ˜¯åº”该由其他类æ¥è´Ÿè´£ï¼Œæ¯”如在Netty4ä¸å°±åœ¨ChannelHandlerContextæ·ÕdŠ äº†writeæ–ÒŽ³•åQŒè™½ç„¶netty4òq¶æ²¡æœ‰åˆ 除Channelä¸çš„write接å£ã€?br />Netty3ä¸çš„Intercepting Filter模å¼
如果说Reactoræ¨¡å¼æ˜¯Netty3的骨æžÓž¼Œé‚£ä¹ˆIntercepting Filter模å¼åˆ™æ˜¯Nettyçš„ä¸æž¢ã€‚Reactor模å¼ä¸»è¦åº”用在Netty3的内部实玎ͼŒå®ƒæ˜¯Netty3å…ähœ‰è‰¯å¥½æ€§èƒ½çš„基¼‹€åQŒè€ŒIntercepting Filter模å¼åˆ™æ˜¯ChannelHandler¾l„åˆå®žçŽ°ä¸€ä¸ªåº”ç”¨ç¨‹åºé€»è¾‘的基¼‹€åQŒåªæœ‰å¾ˆå¥½çš„ç†è§£äº†è¿™ä¸ªæ¨¡å¼æ‰èƒ½ä‹É用好NettyåQŒç”šè‡Œ™ƒ½å¾—心应手ã€?br />
关于Intercepting Filter模å¼çš„详¾l†ä»‹¾lå¯ä»¥å‚è€?a href="http://www.aygfsteel.com/DLevin/archive/2015/09/03/427086.html">˜q™é‡ŒåQŒæœ¬èЂ䏻è¦ä»‹¾lNetty3ä¸å¯¹Intercepting Filter模å¼çš„实玎ͼŒå…¶å®žž®±æ˜¯DefaultChannelPipeline对Intercepting Filter模å¼çš„实现。在上文有æåˆ°Netty3çš„ChannelPipeline是ChannelHandler的容器,用于å˜å‚¨ä¸Žç®¡ç†ChannelHandleråQŒåŒæ—¶å®ƒåœ¨Netty3ä¸ä¹Ÿèµ·åˆ°æ¡¥æ¢çš„作用,å›_®ƒæ˜¯è¿žæŽ¥Netty3内部到所有ChannelHandler的桥æ¢ã€‚作为ChannelPipeline的实现者DefaultChannelPipelineåQŒå®ƒä½¿ç”¨ä¸€ä¸ªChannelHandlerçš„åŒå‘链表æ¥å˜å‚¨åQŒä»¥DefaultChannelPipelineContextä½œäØ“èŠ‚ç‚¹åQ?br />public interface ChannelHandlerContext {
Channel getChannel();
ChannelPipeline getPipeline();
String getName();
ChannelHandler getHandler();
boolean canHandleUpstream();
boolean canHandleDownstream();
void sendUpstream(ChannelEvent e);
void sendDownstream(ChannelEvent e);
Object getAttachment();
void setAttachment(Object attachment);
}
private final class DefaultChannelHandlerContext implements ChannelHandlerContext {
volatile DefaultChannelHandlerContext next;
volatile DefaultChannelHandlerContext prev;
private final String name;
private final ChannelHandler handler;
private final boolean canHandleUpstream;
private final boolean canHandleDownstream;
private volatile Object attachment;
.....
}
在DefaultChannelPipelineä¸ï¼Œå®ƒå˜å‚¨äº†å’Œå½“å‰ChannelPipeline相关è”çš„Channelã€ChannelSink以åŠChannelHandler链表的headã€tailåQŒæ‰€æœ‰ChannelEvent通过sendUpstreamã€sendDownstreamä¸ºå…¥å£æµ¾l整个链表:
public class DefaultChannelPipeline implements ChannelPipeline {
private volatile Channel channel;
private volatile ChannelSink sink;
private volatile DefaultChannelHandlerContext head;
private volatile DefaultChannelHandlerContext tail;
......
public void sendUpstream(ChannelEvent e) {
DefaultChannelHandlerContext head = getActualUpstreamContext(this.head);
if (head == null) {
return;
}
sendUpstream(head, e);
}
void sendUpstream(DefaultChannelHandlerContext ctx, ChannelEvent e) {
try {
((ChannelUpstreamHandler) ctx.getHandler()).handleUpstream(ctx, e);
} catch (Throwable t) {
notifyHandlerException(e, t);
}
}
public void sendDownstream(ChannelEvent e) {
DefaultChannelHandlerContext tail = getActualDownstreamContext(this.tail);
if (tail == null) {
try {
getSink().eventSunk(this, e);
return;
} catch (Throwable t) {
notifyHandlerException(e, t);
return;
}
}
sendDownstream(tail, e);
}
void sendDownstream(DefaultChannelHandlerContext ctx, ChannelEvent e) {
if (e instanceof UpstreamMessageEvent) {
throw new IllegalArgumentException("cannot send an upstream event to downstream");
}
try {
((ChannelDownstreamHandler) ctx.getHandler()).handleDownstream(ctx, e);
} catch (Throwable t) {
e.getFuture().setFailure(t);
notifyHandlerException(e, t);
}
}
对Upstream事äšgåQŒå‘åŽæ‰¾åˆ°æ‰€æœ‰å®žçŽîCº†ChannelUpstreamHandler接å£çš„ChannelHandler¾l„æˆé“¾ï¼ˆgetActualUpstreamContext()åQ?/span>åQŒè€Œå¯¹Downstream事äšgåQŒå‘剿‰¾åˆ°æ‰€æœ‰å®žçŽîCº†ChannelDownstreamHandler接å£çš„ChannelHandler¾l„æˆé“¾ï¼ˆgetActualDownstreamContext()åQ‰ï¼š
private DefaultChannelHandlerContext getActualUpstreamContext(DefaultChannelHandlerContext ctx) {
if (ctx == null) {
return null;
}
DefaultChannelHandlerContext realCtx = ctx;
while (!realCtx.canHandleUpstream()) {
realCtx = realCtx.next;
if (realCtx == null) {
return null;
}
}
return realCtx;
}
private DefaultChannelHandlerContext getActualDownstreamContext(DefaultChannelHandlerContext ctx) {
if (ctx == null) {
return null;
}
DefaultChannelHandlerContext realCtx = ctx;
while (!realCtx.canHandleDownstream()) {
realCtx = realCtx.prev;
if (realCtx == null) {
return null;
}
}
return realCtx;
}
在实际实现ChannelUpstreamHandler或ChannelDownstreamHandleræ—Óž¼Œè°ƒç”¨
ChannelHandlerContextä¸çš„sendUpstream或sendDownstreamæ–ÒŽ³•ž®†æŽ§åˆ¶æµ½E‹äº¤¾l™ä¸‹ä¸€ä¸?
ChannelUpstreamHandler或下一个ChannelDownstreamHandleråQŒæˆ–调用Channelä¸çš„writeæ–ÒŽ³•å‘é€?
å“应消æ¯ã€?br />public class MyChannelUpstreamHandler implements ChannelUpstreamHandler {
public void handleUpstream(ChannelHandlerContext ctx, ChannelEvent e) throws Exception {
// handle current logic, use Channel to write response if needed.
// ctx.getChannel().write(message);
ctx.sendUpstream(e);
}
}
public class MyChannelDownstreamHandler implements ChannelDownstreamHandler {
public void handleDownstream(
ChannelHandlerContext ctx, ChannelEvent e) throws Exception {
// handle current logic
ctx.sendDownstream(e);
}
}
当ChannelHandlerå‘ChannelPipelineContextå‘é€äº‹ä»¶æ—¶åQŒå…¶å†…部从当å‰ChannelPipelineContextèŠ‚ç‚¹å‡ºå‘æ‰‘Öˆ°ä¸‹ä¸€ä¸ªChannelUpstreamHandler或ChannelDownstreamHandler实例åQŒåƈå‘å…¶å‘é€ChannelEventåQŒå¯¹äºŽDownstream链,如果到达铑ְ¾åQŒåˆ™ž®†ChannelEventå‘é€ç»™ChannelSinkåQ?br />public void sendDownstream(ChannelEvent e) {
DefaultChannelHandlerContext prev = getActualDownstreamContext(this.prev);
if (prev == null) {
try {
getSink().eventSunk(DefaultChannelPipeline.this, e);
} catch (Throwable t) {
notifyHandlerException(e, t);
}
} else {
DefaultChannelPipeline.this.sendDownstream(prev, e);
}
}
public void sendUpstream(ChannelEvent e) {
DefaultChannelHandlerContext next = getActualUpstreamContext(this.next);
if (next != null) {
DefaultChannelPipeline.this.sendUpstream(next, e);
}
}
æ£æ˜¯å› 䨓˜q™ä¸ªå®žçްåQŒå¦‚果在一个末ž®„¡š„ChannelUpstreamHandlerä¸å…ˆ¿U»é™¤è‡ªå·±åQŒåœ¨å‘末ž®¾æ·»åŠ ä¸€ä¸ªæ–°çš„ChannelUpstreamHandleråQŒå®ƒæ˜¯æ— 效的åQŒå› 为它的nextå·²ç»åœ¨è°ƒç”¨å‰ž®±å›ºå®šè®¾¾|®äØ“null了ã€?br />
ChannelPipelineä½œäØ“ChannelHandler的容器,它还æä¾›äº†å„¿U增ã€åˆ ã€æ”¹ChannelHandler链表ä¸çš„æ–ÒŽ³•åQŒè€Œä¸”如果æŸä¸ªChannelHandler˜q˜å®žçŽîCº†LifeCycleAwareChannelHandleråQŒåˆ™è¯¥ChannelHandler在被æ·ÕdŠ ˜q›ChannelPipeline或从ä¸åˆ 除时都会得到åŒå¿—åQ?br />public interface LifeCycleAwareChannelHandler extends ChannelHandler {
void beforeAdd(ChannelHandlerContext ctx) throws Exception;
void afterAdd(ChannelHandlerContext ctx) throws Exception;
void beforeRemove(ChannelHandlerContext ctx) throws Exception;
void afterRemove(ChannelHandlerContext ctx) throws Exception;
}
public interface ChannelPipeline {
void addFirst(String name, ChannelHandler handler);
void addLast(String name, ChannelHandler handler);
void addBefore(String baseName, String name, ChannelHandler handler);
void addAfter(String baseName, String name, ChannelHandler handler);
void remove(ChannelHandler handler);
ChannelHandler remove(String name);
<T extends ChannelHandler> T remove(Class<T> handlerType);
ChannelHandler removeFirst();
ChannelHandler removeLast();
void replace(ChannelHandler oldHandler, String newName, ChannelHandler newHandler);
ChannelHandler replace(String oldName, String newName, ChannelHandler newHandler);
<T extends ChannelHandler> T replace(Class<T> oldHandlerType, String newName, ChannelHandler newHandler);
ChannelHandler getFirst();
ChannelHandler getLast();
ChannelHandler get(String name);
<T extends ChannelHandler> T get(Class<T> handlerType);
ChannelHandlerContext getContext(ChannelHandler handler);
ChannelHandlerContext getContext(String name);
ChannelHandlerContext getContext(Class<? extends ChannelHandler> handlerType);
void sendUpstream(ChannelEvent e);
void sendDownstream(ChannelEvent e);
ChannelFuture execute(Runnable task);
Channel getChannel();
ChannelSink getSink();
void attach(Channel channel, ChannelSink sink);
boolean isAttached();
List<String> getNames();
Map<String, ChannelHandler> toMap();
}
在DefaultChannelPipelineçš„ChannelHandler链æ¡çš„å¤„ç†æµ½E‹äØ“åQ?br />
å‚考:
《Netty主页�/a>
《Nettyæºç 解读åQˆå››åQ‰Netty与Reactor模å¼ã€?/a>
《Netty代ç 分æžã€?/a>
Scalable IO In Java
Intercepting Filter Pattern

]]>