worker的任务
Worker:IO线程负责编解码
sent事件回调方法、心跳全部在IO线程上执行
- all : 除sent事件回调方法、心跳外,全部在线程池上执行。
注:AllChannelHandler并未重写WrappedChannelHandler的sent方法,也就是说ChannelHandler#sent事件回调方法,是在IO线程中执行。
2、execution : 与all类似,唯一区就是all在线程池未指定时,可以使用共享线程池,这个差别等同于没有。
3、 message : 只有请求事件在线程池中执行,其他在IO线程上执行。
4、connection : 请求事件在线程池中执行,连接、断开连接事件排队执行(含一个线程的线程池)
5、direct : 所有事件都在IO线程中执行。
doOpen方法中在netty channel的pipeline中按照顺序指定了继承于SimpleChannelUpstreamHandler的编解码handler和业务handler(远程暴露),意味着客户端请求的时候,会首先经过编解码handler,然后到达业务处理handler
--->NettyServer.doOpen
….
---> NettyCodecAdapter中的InternalDecoder. messageReceived
--->DubboCountCodec. Decode
--->ExchangeCodec. Decode进行解码
-->SimpleChannelHandler.handleUpstream(
ChannelHandlerContext ctx, ChannelEvent e)
-->NettyHandler.messageReceived(ChannelHandlerContext ctx, MessageEvent e)// 将netty的channel包装成dubbo自身封装的channel,使用dubbo自身的ChannelHandler去处理消息
--> MultiMessageHandler.received(Channel channel, Object message)
-->HeartbeatHandler.received(Channel channel, Object message)
- 如果在heartbeat内没有进行读操作或者写操作,则发送心跳请求
- 如果正常消息和心跳在heartbeatTimeout都没接收到,consumer端会进行重连,provider端会关闭channel
-->AllChannelHandler.received(Channel channel, Object message)// AllChannelHandler对应一种线程派发策略。注:all:除sent事件回调方法、心跳在IO线程上执行外,剩余在业务线程池上执行
-->ExecutorService cexecutor = getExecutorService()
-->cexecutor.execute(new ChannelEventRunnable(channel, handler, ChannelState.RECEIVED, message))//拿到ExecutorService,是new一个ChannelEventRunnable扔到线程池处理
-->ChannelEventRunnable.run()