//netty 中writeandflush()方法
整體步驟:先write再flush
ctx.writeAndFlush() –> TailHandler –> Handler … —> HeadHandler –> Unsafe.write()?
write方法實(shí)際上并沒有將消息寫出去, 而是將消息msg和此次操作的promise放入到當(dāng)前連接的輸出緩沖區(qū)OutboundBuffer中了;
ctx.writeAndFlush() –> TailHandler –> Handler … —> HeadHandler –> Unsafe.flush() –> AbstractNioByteChannel.doWrite() –> ChannelOutboundBuffer.remove() –> Promise.notifyListeners();
Netty強(qiáng)烈建議直接通過添加監(jiān)聽器的方式獲取IO結(jié)果,而不是通過同步等待的方式
如果用戶操作調(diào)用了sync或者await方法,會在對應(yīng)的future對象上阻塞用戶線程,例如future.channel().closeFuture().sync()
//springboot第27章
ApplicationEvent以及Listener是Spring為我們提供的一個事件監(jiān)聽、訂閱的實(shí)現(xiàn),內(nèi)部實(shí)現(xiàn)原理是觀察者設(shè)計模式
在Spring內(nèi)部中有多種方式實(shí)現(xiàn)監(jiān)聽如:@EventListener注解、實(shí)現(xiàn)ApplicationListener泛型接口、實(shí)現(xiàn)SmartApplicationListener接口等,我們下面來講解下這三種方式分別如何實(shí)現(xiàn)。
既然是監(jiān)聽所有的事件發(fā)布,那么SmartApplicationListener接口添加了兩個方法supportsEventType、supportsSourceType來作為區(qū)分是否是我們監(jiān)聽的事件,只有這兩個方法同時返回true時才會執(zhí)行onApplicationEvent方法。
事件監(jiān)聽是無序的,監(jiān)聽到的事件先后順序完全隨機(jī)出現(xiàn)的