Netty in Action笔记(Chpater1 ~ 2) First Netty application

【Chapter 1 Netty and Java NIO APIs】
The entire Netty API is asynchronous.安全

Asynchronous processing encourages you to use your resources more efficiently by allowing you to start a task and get notified when it's done rather than waiting for it to complete. You're free to do something else while the task is running.app

实现异步的两种方法:异步

  1. 回调(实现接口的方法,即监听器)
  2. Future(A Future object either holds the result of a computation or, in the case of a failed computation, an exception.)。能够取消、检查是否完成,阻塞直到完成

On Linux-like OSs the selector makes use of the epoll- IO event notification facility. This is a high-performance technique in which the OS works asynchronously with the networking stack.Unfortunately, even today the famous epoll- bug can lead to an invalid state in the
selector, resulting in 100% CPU-usage and spinning.async

【Chapter 2 Your first Netty application】ide

Handler能够被多个Channel共享,这时Handler必须被@Sharable注解且必须是线程安全的this

ctx.writeAndFlush(Unpooled.EMPTY_BUFFER)        //writeAndFlush是异步操做,返回ChannelFuture
    .addListener(ChannelFutureListener.CLOSE);  //经过ChannelFuture.addListener()注册监听器,当Future.isDone()等于true时会执行监听器

对于一个Channel,其pipeline中至少要有一个Handler可以处理异常线程

Next, override the channelRead0() method. The method is called once data is received.Note that the bytes may be fragmented, which means that if the server writes 5 bytes it s not guaranteed that all 5 bytes will be received at once. For 5 bytes, the channelRead0() method could be called twice, for example. The first time it may be called with a ByteBuf that holds 3 bytes and the second time with a ByteBuf that holds 2 bytes. The only guarantee is that the bytes will be received in the same order as they re sent. But this is only true for TCP or other stream-orientated protocols.code

SimpleChannelInboundHandler与ChannelInboundHandlerAdapter的区别:orm

  • ChannelInboundHandlerAdapter的channelRead(ctx,
    msg)须要释放msg,若是msg是ByteBuf类型,则须要调用ByteBuf.release()方法(由于Netty默认使用支持池的Buf,不release的会发生内存泄露,即这个BUf在JVM退出以前永远不会被GC回收);
  • 而SimpleChannelInboundHandler呢,it will release the message once the
    channelRead0(...) method completes. This is done by Netty to handle
    all messages that are implement ReferenceCounted.
  • But why not do the same in the EchoServerHandler? The reason for this is that we want to echo back the message, which means we can not release it yet as the write operation may completes after channelRead(...) returns (remember write is asynchronous). Once the write completes Netty will automatically release the message.