worker的任务

Worker:IO线程负责编解码

sent事件回调方法、心跳全部在IO线程上执行

  1. 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

worker的任务

--->NettyServer.doOpen

….

---> NettyCodecAdapter中的InternalDecoder. messageReceived

--->DubboCountCodec. Decode

--->ExchangeCodec. Decode进行解码

worker的任务worker的任务

-->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)

 worker的任务

  • 如果在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()

worker的任务 worker的任务