1.½ø³ÌµÄÓÅÑÅÍ˳ö
1.1.Kill -9 PID´øÀ´µÄÎÊÌâ
ÔÚLinuxÉÏͨ³£»áͨ¹ýkill -9 pidµÄ·½Ê½Ç¿Öƽ«Ä³¸ö½ø³Ìɱµô£¬ÕâÖÖ·½Ê½¼òµ¥¸ßЧ£¬Òò´ËºÜ¶à³ÌÐòµÄÍ£Ö¹½Å±¾¾³£»áÑ¡ÔñʹÓÃkill
-9 pidµÄ·½Ê½¡£
ÎÞÂÛÊÇLinuxµÄKill -9 pid»¹ÊÇwindowsµÄtaskkill /f /pidÇ¿ÖÆ½ø³ÌÍ˳ö,¶¼»á´øÀ´Ò»Ð©¸±×÷Ó㺶ÔÓ¦ÓÃÈí¼þ¶øÑÔÆäЧ¹ûµÈͬÓÚͻȻµôµç£¬¿ÉÄܻᵼÖÂÈçÏÂһЩÎÊÌ⣺
»º´æÖеÄÊý¾ÝÉÐδ³Ö¾Ã»¯µ½´ÅÅÌÖУ¬µ¼ÖÂÊý¾Ý¶ªÊ§£»
ÕýÔÚ½øÐÐÎļþµÄwrite²Ù×÷£¬Ã»ÓиüÐÂÍê³É£¬Í»È»Í˳ö£¬µ¼ÖÂÎļþË𻵣»
Ï̵߳ÄÏûÏ¢¶ÓÁÐÖÐÉÐÓнÓÊÕµ½µÄÇëÇóÏûÏ¢»¹Ã»À´µÃ¼°´¦Àí£¬µ¼ÖÂÇëÇóÏûÏ¢¶ªÊ§£»
Êý¾Ý¿â²Ù×÷ÒѾÍê³É£¬ÀýÈçÕË»§Óà¶î¸üУ¬×¼±¸·µ»ØÓ¦´ðÏûÏ¢¸ø¿Í»§¶Ëʱ£¬ÏûÏ¢ÉÐÔÚͨÐÅÏ̵߳ķ¢ËͶÓÁÐÖÐÅŶӵȴý·¢ËÍ£¬½ø³ÌÇ¿ÖÆÍ˳öµ¼ÖÂÓ¦´ðÏûϢûÓзµ»Ø¸ø¿Í»§¶Ë£¬¿Í»§¶Ë·¢Æð³¬Ê±ÖØÊÔ£¬»á´øÀ´Öظ´¸üÐÂÎÊÌ⣻
ÆäËüÎÊÌâµÈ...
< 1.2.JAVAÓÅÑÅÍ˳ö
JavaµÄÓÅÑÅÍ£»úͨ³£Í¨¹ý×¢²áJDKµÄShutdownHookÀ´ÊµÏÖ£¬µ±ÏµÍ³½ÓÊÕµ½Í˳öÖ¸Áîºó£¬Ê×Ïȱê¼Çϵͳ´¦ÓÚÍ˳ö״̬£¬²»ÔÙ½ÓÊÕеÄÏûÏ¢£¬È»ºó½«»ýѹµÄÏûÏ¢´¦ÀíÍ꣬×îºóµ÷ÓÃ×ÊÔ´»ØÊÕ½Ó¿Ú½«×ÊÔ´Ïú»Ù£¬×îºó¸÷Ïß³ÌÍ˳öÖ´ÐС£
ͨ³£ÓÅÑÅÍ˳öÐèÒªÓг¬Ê±¿ØÖÆ»úÖÆ£¬ÀýÈç30S£¬Èç¹ûµ½´ï³¬Ê±Ê±¼äÈÔȻûÓÐÍê³ÉÍ˳öǰµÄ×ÊÔ´»ØÊյȲÙ×÷£¬ÔòÓÉÍ£»ú½Å±¾Ö±½Óµ÷ÓÃkill
-9 pid£¬Ç¿ÖÆÍ˳ö¡£
2. ÈçºÎʵÏÖNettyµÄÓÅÑÅÍ˳ö
ҪʵÏÖNettyµÄÓÅÑÅÍ˳ö£¬Ê×ÏÈÐèÒªÁ˽âͨÓÃJava½ø³ÌµÄÓÅÑÅÍ˳öÈçºÎʵÏÖ¡£ÏÂÃæÎÒÃÇÏȽ²½âÏÂÓÅÑÅÍ˳öµÄʵÏÖÔÀí£¬²¢½áºÏʵ¼Ê´úÂë½øÐн²½â¡£×îºó¿´ÏÂÈçºÎʵÏÖNettyµÄÓÅÑÅÍ˳ö¡£
2.0.1. Ðźżò½é
ÐźÅÊÇÔÚÈí¼þ²ã´ÎÉ϶ÔÖжϻúÖÆµÄÒ»ÖÖÄ£Ä⣬ÔÚÔÀíÉÏ£¬Ò»¸ö½ø³ÌÊÕµ½Ò»¸öÐźÅÓë´¦ÀíÆ÷ÊÕµ½Ò»¸öÖжÏÇëÇó¿ÉÒÔ˵ÊÇÒ»ÑùµÄ£¬ËüÊǽø³Ì¼äÒ»ÖÖÒ첽ͨÐŵĻúÖÆ¡£ÒÔLinuxµÄkillÃüÁîΪÀý£¬kill
-s SIGKILL pid (¼´kill -9 pid) Á¢¼´É±ËÀÖ¸¶¨pidµÄ½ø³Ì£¬SIGKILL¾ÍÊÇ·¢Ë͸øpid½ø³ÌµÄÐźš£
ÐźžßÓÐÆ½Ì¨Ïà¹ØÐÔ£¬Linuxƽ̨֧³ÖµÄһЩÖÕÖ¹½ø³ÌÐźÅÈçÏÂËùʾ£º
Windowsƽ̨´æÔÚһЩ²îÒ죬ËüµÄһЩÐźžÙÀýÈçÏ£ºSIGINT£¨Ctrl+CÖжϣ©¡¢SIGILL¡¢SIGTERM
£¨kill·¢³öµÄÈí¼þÖÕÖ¹£©¡¢SIGBREAK £¨Ctrl+BreakÖжϣ©¡£
ÐźÅÑ¡Ôñ£ºÎªÁ˲»¸ÉÈÅÕý³£ÐźŵÄÔË×÷£¬ÓÖÄÜÄ£ÄâJavaÒ첽֪ͨ£¬ÔÚLinuxÉÏÎÒÃÇÐèÒªÏÈÑ¡¶¨Ò»ÖÖÌØÊâµÄÐźš£Í¨¹ý²é¿´ÐźÅÁбíÉϵÄÃèÊö£¬·¢ÏÖ
SIGUSR1 ºÍ SIGUSR2 ÊÇÔÊÐíÓû§×Ô¶¨ÒåµÄÐźÅ,ÎÒÃÇ¿ÉÒÔÑ¡ÔñSIGUSR2£¬ÎªÁ˲âÊÔ·½±ã£¬ÔÚWindowsÉÏÎÒÃÇ¿ÉÒÔÑ¡ÔñSIGINT¡£
2.0.2. Java³ÌÐòµÄÓÅÑÅÍ˳ö
Ê×ÏÈ¿´ÏÂͨÓõÄJava½ø³ÌÓÅÑÅÍ˳öµÄÁ÷³Ìͼ£º

µÚÒ»²½£¬Ó¦Óýø³ÌÆô¶¯µÄʱºò£¬³õʼ»¯SignalʵÀý£¬ËüµÄ´úÂëʾÀýÈçÏ£º
Signal sig = new Signal(getOSSignalType()); |
ÆäÖÐSignal¹¹Ô캯ÊýµÄ²ÎÊýΪString×Ö·û´®£¬Ò²¾ÍÊÇ2.1.1С½ÚÖнéÉܵÄÐźÅÁ¿Ãû³Æ¡£

µÚ¶þ²½£¬¸ù¾Ý²Ù×÷ϵͳµÄÃû³ÆÀ´»ñÈ¡¶ÔÓ¦µÄÐźÅÃû³Æ£¬´úÂëÈçÏ£º
private String getOSSignalType() { return System.getProperties().getProperty("os.name"). toLowerCase().startsWith("win") ? "INT" : "USR2"; } |
ÅжÏÊÇ·ñÊÇwindows²Ù×÷ϵͳ£¬Èç¹ûÊÇÔòÑ¡ÔñSIGINT£¬½ÓÊÕCtrl+CÖжϵÄÖ¸Á·ñÔòÑ¡ÔñUSR2Ðźţ¬½ÓÊÕSIGUSR2£¨µÈ¼ÛÓÚkill
-12 pid£©Ö¸Áî¡£
µÚÈý²½£¬½«ÊµÀý»¯Ö®ºóµÄSignalHandler×¢²áµ½JDKµÄSignal£¬Ò»µ©Java½ø³Ì½ÓÊÕµ½kill
-12 »òÕß Ctrl+CÔò»Øµ÷handle½Ó¿Ú£¬´úÂëʾÀýÈçÏ£º
Signal.handle(sig, shutdownHandler);
ÆäÖÐshutdownHandlerʵÏÖÁËSignalHandler½Ó¿ÚµÄhandle(Signal sgin)·½·¨£¬´úÂëʾÀýÈçÏ£º
µÚËIJ½£¬ÔÚ½ÓÊÕµ½ÐźŻص÷µÄhandle½Ó¿ÚÖУ¬³õʼ»¯JDKµÄShutdownHookỊ̈߳¬²¢½«Æä×¢²áµ½RuntimeÖУ¬Ê¾Àý´úÂëÈçÏ£º
private void invokeShutdownHook() { Thread t = new Thread(new ShutdownHook(), "ShutdownHook-Thread"); Runtime.getRuntime().addShutdownHook(t); } |
µÚÎå²½£¬½ÓÊÕµ½½ø³ÌÍ˳öÐźźó£¬Ôڻص÷µÄhandle½Ó¿ÚÖÐÖ´ÐÐÐéÄâ»úµÄÍ˳ö²Ù×÷£¬Ê¾Àý´úÂëÈçÏ£º
Runtime.getRuntime().exit(0); |
ÐéÄâ»úÍ˳öʱ£¬µ×²ã»á×Ô¶¯¼ì²âÓû§ÊÇ·ñ×¢²áÁËShutdownHookÈÎÎñ£¬Èç¹ûÓУ¬Ôò»á×Ô¶¯½«ShutdownHookÏß³ÌÀÆð£¬Ö´ÐÐËüµÄRun·½·¨£¬Óû§Ö»ÐèÒªÔÚShutdownHookÖÐÖ´ÐÐ×ÊÔ´ÊͷŲÙ×÷¼´¿É£¬Ê¾Àý´úÂëÈçÏ£º
class ShutdownHook implements Runnable { @Override public void run() { System.out.println("ShutdownHook execute start..."); System.out.print("Netty NioEventLoopGroup shutdownGracefully..."); try { TimeUnit.SECONDS.sleep(10);//Ä£ÄâÓ¦Óýø³ÌÍ˳öǰµÄ´¦Àí²Ù×÷ } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("ShutdownHook execute end..."); System.out.println("Sytem shutdown over, the cost time is 10000MS"); } } |
ÏÂÃæÎÒÃÇÔÚWindows»·¾³ÖжÔͨÓõÄJavaÓÅÑÅÍ˳ö³ÌÐò½øÐвâÊÔ£¬´ò¿ªCMD¿ØÖÆÌ¨£¬ÀÆð´ý²âÊÔ³ÌÐò£¬ÈçÏÂËùʾ£º
Æô¶¯½ø³Ì£º

²é¿´Ïß³ÌÐÅÏ¢£¬·¢ÏÖ×¢²áµÄShutdownHookÏß³ÌûÓÐÆô¶¯£¬·ûºÏÔ¤ÆÚ£º

ÔÚ¿ØÖÆÌ¨Ö´ÐÐCtrl+C£¬Ê¹½ø³ÌÍ˳ö£¬Ê¾ÀýÈçÏ£º

ÈçÉÏͼËùʾ£¬ÎÒÃǶ¨ÒåµÄShutdownHookÏß³ÌÔÚJVMÍ˳öʱ±»Ö´ÐУ¬×÷Ϊ²âÊÔ³ÌÐò£¬ËüÐÝÃß10SÖ®ºóÍ˳ö£¬¿ØÖÆÌ¨´òÓ¡µÄÏà¹ØÐÅÏ¢ÈçÏ£º

ÏÂÃæÎÒÃÇ×ܽáÏÂͨÓõÄJava³ÌÐòÓÅÑÅÍ˳öµÄ¼¼ÊõÒªµã£º

2.0.3. NettyµÄÓÅÑÅÍ˳ö
ÔÚʵ¼ÊÏîÄ¿ÖУ¬Netty×÷Ϊ¸ßÐÔÄܵÄÒì²½NIOͨÐÅ¿ò¼Ü£¬ÍùÍùÓÃ×÷»ù´¡Í¨ÐÅ¿ò¼Ü¸ºÔð¸÷ÖÖÐÒéµÄ½ÓÈë¡¢½âÎöºÍµ÷¶ÈµÈ£¬ÀýÈçÔÚRPCºÍ·Ö²¼Ê½·þÎñ¿ò¼ÜÖУ¬ÍùÍù»áʹÓÃNetty×÷ΪÄÚ²¿Ë½ÓÐÐÒéµÄ»ù´¡Í¨ÐÅ¿ò¼Ü¡£
µ±Ó¦Óýø³ÌÓÅÑÅÍ˳öʱ£¬×÷ΪͨÐÅ¿ò¼ÜµÄNettyÒ²ÐèÒªÓÅÑÅÍ˳ö£¬Ö÷ÒªÔÒòÈçÏ£º
¾¡¿ìµÄÊÍ·ÅNIOÏ̡߳¢¾ä±úµÈ×ÊÔ´£»
Èç¹ûʹÓÃflush×öÅúÁ¿ÏûÏ¢·¢ËÍ£¬ÐèÒª½«»ýÔÜÔÚ·¢ËͶÓÁÐÖеĴý·¢ËÍÏûÏ¢·¢ËÍÍê³É£»
ÕýÔÚwrite»òÕßreadµÄÏûÏ¢£¬ÐèÒª¼ÌÐø´¦Àí£»
ÉèÖÃÔÚNioEventLoopÏ̵߳÷¶ÈÆ÷ÖеĶ¨Ê±ÈÎÎñ£¬ÐèÒªÖ´ÐлòÕßÇåÀí¡£
ÏÂÃæÎÒÃÇ¿´ÏÂNettyÓÅÑÅÍ˳öÉæ¼°µÄÖ÷Òª²Ù×÷ºÍ×ÊÔ´¶ÔÏó£º

NettyµÄÓÅÑÅÍ˳ö×ܽáÆðÀ´ÓÐÈý´ó²½²Ù×÷£º
°ÑNIOÏ̵߳Ä״̬λÉèÖóÉST_SHUTTING_DOWN״̬£¬²»ÔÙ´¦ÀíеÄÏûÏ¢£¨²»ÔÊÐíÔÙ¶ÔÍâ·¢ËÍÏûÏ¢£©£»
Í˳öǰµÄÔ¤´¦Àí²Ù×÷£º°Ñ·¢ËͶÓÁÐÖÐÉÐδ·¢ËÍ»òÕßÕýÔÚ·¢Ë͵ÄÏûÏ¢·¢ËÍÍê¡¢°ÑÒѾµ½ÆÚ»òÕßÔÚÍ˳ö³¬Ê±Ö®Ç°µ½ÆÚµÄ¶¨Ê±ÈÎÎñÖ´ÐÐÍê³É¡¢°ÑÓû§×¢²áµ½NIOÏ̵߳ÄÍ˳öHookÈÎÎñÖ´ÐÐÍê³É£»
×ÊÔ´µÄÊͷŲÙ×÷£ºËùÓÐChannelµÄÊÍ·Å¡¢¶à·¸´ÓÃÆ÷µÄÈ¥×¢²áºÍ¹Ø±Õ¡¢ËùÓжÓÁкͶ¨Ê±ÈÎÎñµÄÇå¿ÕÈ¡Ïû£¬×îºóÊÇNIOÏ̵߳ÄÍ˳ö¡£
ÏÂÃæÎÒÃǾßÌå¿´ÏÂÈçºÎʵÏÖNettyµÄÓÅÑÅÍ˳ö£º
NettyÓÅÑÅÍ˳öµÄ½Ó¿ÚºÍ×ÜÈë¿ÚÔÚEventLoopGroup£¬µ÷ÓÃËüµÄshutdownGracefully·½·¨¼´¿É£¬Ïà¹Ø´úÂëÈçÏ£º
bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); |
³ýÁËÎ޲εÄshutdownGracefully·½·¨£¬»¹¿ÉÒÔÖ¸¶¨Í˳öµÄ³¬Ê±Ê±¼äºÍÖÜÆÚ£¬Ïà¹Ø½Ó¿Ú¶¨ÒåÈçÏ£º

EventLoopGroupµÄshutdownGracefully¹¤×÷ÔÀíϸöÕ½Ú×öÏêϸ½²½â£¬½áºÏJavaͨÓõÄÓÅÑÅÍ˳ö»úÖÆ£¬¼´¿ÉʵÏÖNettyµÄÓÅÑÅÍ˳ö£¬Ïà¹ØÎ±´úÂëÈçÏ£º
//ͳһ¶¨ÒåJVMÍ˳öʼþ£¬²¢½«JVMÍ˳öʼþ×÷ΪÖ÷Ìâ¶Ô½ø³ÌÄÚ²¿·¢²¼ //ËùÓÐÐèÒªÓÅÑÅÍ˳öµÄÏû·ÑÕß¶©ÔÄJVMÍ˳öʼþÖ÷Ìâ //¼àÌýJVMÍ˳öµÄShutdownHook±»Æô¶¯Ö®ºó£¬·¢²¼JVMÍ˳öʼþ //Ïû·ÑÕß¼àÌýµ½JVMÍ˳öʼþ£¬¿ªÊ¼Ö´ÐÐ×ÔÉíµÄÓÅÑÅÍ˳ö //Èç¹ûËùÓеķÇÊØ»¤Ï̶߳¼³É¹¦Íê³ÉÓÅÑÅÍ˳ö£¬½ø³ÌÖ÷¶¯Í˳ö //Èç¹ûµ½ÁËÍ˳öµÄ³¬Ê±Ê±¼äÈÔȻûÕý³£Í˳ö£¬ ÔòÓÉÍ£»ú½Å±¾Í¨¹ýkill -9 pidǿɱ½ø³Ì£¬Ç¿ÖÆÍ˳ö |
×ܽáһϣºJVMµÄShutdownHook±»´¥·¢Ö®ºó£¬µ÷ÓÃËùÓÐEventLoopGroupʵÀýµÄshutdownGracefully·½·¨½øÐÐÓÅÑÅÍ˳ö¡£ÓÉÓÚNetty×ÔÉí¶ÔÓÅÑÅÍ˳öÓнÏÍêÉÆµÄÖ§³Ö£¬ËùÒÔʵÏÖÆðÀ´Ïà¶Ô±È½Ï¼òµ¥¡£
2.0.4. һЩÎóÇø
ÔÚʵ¼Ê¹¤×÷ÖУ¬ÓÉÓÚ¶ÔÓÅÑÅÍ˳öºÍ×ÊÔ´ÊͷŵÄÔÀí²»Ì«Çå³þ£¬»òÕß¶ÔNettyµÄ½Ó¿Ú²»Ì«Á˽⣬ºÜÈÝÒ×°ÑÓÅÑÅÍ˳öºÍ×ÊÔ´ÊÍ·Å»ìÏý£¬µ¼Ö³öÏÖ¸÷ÖÖÎÊÌâ¡£
Èçϰ¸Àý£º±¾ÒâÊÇÏë°Ñij¸öChannel¹Ø±Õ£¬µ«ÊÇÈ´µ÷ÓÃÁËChannel¹ØÁªµÄEventLoopµÄshutdownGracefully£¬µ¼Ö°ÑEventLoopÏ̺߳Í×¢²áÔÚ¸ÃÏ̳߳ÖÓеĶà·¸´ÓÃÆ÷ÉÏËùÓеÄChannel¶¼¹Ø±ÕÁË£¬´íÎó´úÂëÈçÏÂËùʾ£º
ctx.channel().eventLoop().shutdownGracefully(); |
ÕýÈ·µÄ×ö·¨ÈçÏÂËùʾ£ºµ÷ÓÃchannelµÄclose·½·¨£¬¹Ø±ÕÁ´Â·£¬ÊÍ·ÅÓë¸ÃChannelÏà¹ØµÄ×ÊÔ´£º
³ý·ÇÊÇÕû¸ö½ø³ÌÓÅÑÅÍ˳ö£¬Ò»°ãÇé¿öϲ»»áµ÷ÓÃEventLoopGroupºÍEventLoopµÄshutdownGracefully·½·¨£¬¸ü¶àµÄÊÇÁ´Â·channelµÄ¹Ø±ÕºÍ×ÊÔ´ÊÍ·Å¡£
3. NettyÓÅÑÅÍ˳öÔÀí·ÖÎö
NettyÓÅÑÅÍ˳öÉæ¼°µ½Ïß³Ì×é¡¢Ï̡߳¢Á´Â·¡¢¶¨Ê±ÈÎÎñµÈ£¬µ×²ãʵÏÖϸ½Ú·Ç³£¸´ÔÓ£¬ÏÂÃæÎÒÃǾͲã²ã·Ö½â£¬Í¨¹ýÔ´ÂëÀ´ÆÊÎöËüµÄʵÏÖÔÀí¡£
3.1. NioEventLoopGroup
NioEventLoopGroupʵ¼ÊÊÇNioEventLoopµÄÏß³Ì×飬ËüµÄÓÅÑÅÍ˳ö±È½Ï¼òµ¥£¬Ö±½Ó±éÀúEventLoopÊý×飬ѻ·µ÷ÓÃËüÃǵÄshutdownGracefully·½·¨£¬Ô´ÂëÈçÏ£º

3.2. NioEventLoop
µ÷ÓÃNioEventLoopµÄshutdownGracefully·½·¨£¬Ê×ÏȾÍÊÇÒªÐÞ¸ÄÏß³Ì״̬ΪÕýÔڹرÕ״̬£¬ËüµÄʵÏÖÔÚ¸¸ÀàSingleThreadEventExecutorÖУ¬ËüÃǵļ̳йØÏµÈçÏ£º

SingleThreadEventExecutorµÄshutdownGracefully´úÂë±È½Ï¼òµ¥£¬¾ÍÊÇÐÞ¸ÄÏ̵߳Ä״̬룬ÐèҪעÒâµÄÊÇÐÞ¸ÄʱÐèÒª¶Ô²¢·¢µ÷ÓÃ×öÅжϣ¬Èç¹ûÊÇÓÉNioEventLoop×ÔÉíµ÷Óã¬Ôò²»ÐèÒª¼ÓËø£¬·ñÔòÐèÒª¼ÓËø£¬´úÂëÈçÏ£º

½âÊÍÏÂΪʲôҪ¼ÓËø£¬ÒòΪshutdownGracefullyÊÇpublicµÄ·½·¨£¬ÈκÎÄܹ»»ñÈ¡µ½NioEventLoopµÄ´úÂë¶¼¿ÉÒÔµ÷ÓÃËü£¬ÔÚNettyÖУ¬ÒµÎñ´úÂëͨ³£²»ÐèÒªÖ±½Ó»ñÈ¡NioEventLoop²¢²Ù×÷Ëü£¬µ«ÊÇNetty¶ÔNioEventLoop×öÁ˱ȽϺñµÄ·â×°£¬Ëü²»½ö½öÖ»ÄܶÁдÏûÏ¢£¬»¹Äܹ»Ö´Ðж¨Ê±ÈÎÎñ£¬²¢×÷ΪÏ̳߳ØÖ´ÐÐÓû§×Ô¶¨ÒåTask¡£Òò´ËÔÚChannelÖн«»ñÈ¡NioEventLoopµÄ·½·¨¿ª·ÅÁ˳öÀ´£¬Õâ¾ÍÒâζ×ÅÓû§Ö»ÒªÄܹ»»ñÈ¡µ½Channel£¬ÀíÂÛÉÏ¾Í»á´æÔÚ²¢·¢Ö´ÐÐshutdownGracefullyµÄ¿ÉÄÜ£¬Òò´ËÔÚÓÅÑÅÍ˳öµÄʱºò×öÁ˲¢·¢±£»¤¡£
Íê³É״̬ÐÞ¸ÄÖ®ºó£¬Ê£ÏµIJÙ×÷Ö÷ÒªÔÚNioEventLoopÖнøÐУ¬´úÂëÈçÏ£º

ÎÒÃǼÌÐø¿´ÏÂcloseAllµÄʵÏÖ£¬ËüµÄÔÀíÊǰÑ×¢²áÔÚselectorÉϵÄËùÓÐChannel¶¼¹Ø±Õ£¬µ«ÊÇÓÐЩChannelÕýÔÚ·¢ËÍÏûÏ¢£¬ÔÝʱ»¹²»Äܹأ¬ÐèÒªÉÔºóÔÙÖ´ÐУ¬ºËÐÄ´úÂëÈçÏ£º

Ñ»·µ÷ÓÃChannel UnsafeµÄclose·½·¨£¬ÏÂÃæÎÒÃÇÌø×ªµ½UnsafeÖУ¬¶Ôclose·½·¨½øÐзÖÎö¡£
3.3. AbstractUnsafe
AbstractUnsafeµÄclose·½·¨Ö÷Òª×öÁËÈçϼ¸¼þÊ£º
1£®Åжϵ±Ç°¸ÃÁ´Â·ÊÇ·ñÓÐÏûÏ¢ÕýÔÚ·¢ËÍ£¬Èç¹ûÓÐÔò½«¹Ø±Õ²Ù×÷·â×°³ÉTask·Åµ½eventLoopÖÐÉÔºóÔÙÖ´ÐУº

2£®½«·¢ËͶÓÁÐÇå¿Õ£¬²»ÔÙÔÊÐí·¢ËÍеÄÏûÏ¢£º

3£®µ÷ÓÃSocketChannelµÄclose·½·¨£¬¹Ø±ÕÁ´Â·£º

4£®µ÷ÓÃpipelineµÄfireChannelInactive£¬´¥·¢Á´Â·¹Ø±Õ֪ͨʼþ£º

5£®×îºóÊǵ÷ÓÃderegister£¬´Ó¶à·¸´ÓÃÆ÷ÉÏÈ¡ÏûSelectionKey£º

ÖÁ´Ë£¬ÓÅÑÅÍ˳öÁ÷³ÌÒѾÍê³É£¬ÕâÊÇ·ñÒâζ×ÅNioEventLoopÏ߳̿ÉÒÔÍ˳öÁË£¬Æäʵ²¢·ÇÈç´Ë¡£
ÔÚ´Ë´¦£¬Ö»ÊÇ×öÁËChannelµÄ¹Ø±ÕºÍ ´ÓSelectorÉϵÄÈ¥×¢²á£¬×ܽáÈçÏ£º
ͨ¹ýinFlush0À´Åжϵ±Ç°ÊÇ·ñÕýÔÚ·¢ËÍÏûÏ¢£¬Èç¹ûÊÇ£¬Ôò²»Ö´ÐÐChannel¹Ø±Õ¶¯×÷£¬·ÅÈëNIOÏ̵߳ÄÈÎÎñ¶ÓÁÐÖÐÉÔºóÔÙÖ´ÐÐclose()²Ù×÷£»
ÒòΪÒѾ²»ÔÊÐíеķ¢ËÍÏûÏ¢¼ÓÈ룬һµ©·¢ËͲÙ×÷Íê³É£¬¾ÍÖ´ÐÐÁ´Â·¹Ø±Õ¡¢´¥·¢Á´Â·¹Ø±ÕʼþºÍ´ÓSelectorÉÏÈ¡Ïû×¢²á²Ù×÷¡£
֮ǰÒѾ˵ÁË£¬NioEventLoop³ýÁËI/O¶Áд֮Í⣬»¹¼æ¾ß¶¨Ê±ÈÎÎñÖ´ÐС¢¹Ø±ÕShutdownHookµÄÖ´Ðеȣ¬Èç¹û´ËʱÓе½ÆÚµÄ¶¨Ê±ÈÎÎñ£¬¼´Ê¹ChanelÒѾ¹Ø±Õ£¬µ«ÊÇÈÔÈ»ÐèÒª¼ÌÐøÖ´ÐУ¬Ï̲߳»ÄÜÍ˳ö¡£ÏÂÃæÎÒÃǾßÌå·ÖÎöÏÂTaskQueueµÄ´¦ÀíÁ÷³Ì¡£
3.4. TaskQueue
NioEventLoopÖ´ÐÐÍêcloseAll£¨£©²Ù×÷Ö®ºó£¬ÐèÒªµ÷ÓÃconfirmShutdown¿´ÊÇ·ñÕæµÄÄܹ»Í˳ö£¬ËüµÄ´¦ÀíÂß¼ÈçÏ£º
1£®Ö´ÐÐTaskQueueÖÐÅŶӵÄTask£¬´úÂëÈçÏ£º

2£®Ö´ÐÐ×¢²áµ½NioEventLoopÖеÄShutdownHook£¬´úÂëÈçÏ£º

3£®ÅжÏÊÇ·ñµ½´ïÓÅÑÅÍ˳öµÄÖ¸¶¨³¬Ê±Ê±¼ä£¬Èç¹û´ïµ½»òÕß¹ýÁ˳¬Ê±Ê±¼ä£¬ÔòÁ¢¼´Í˳ö£¬´úÂëÈçÏ£º

4£®Èç¹ûûµ½´ïÖ¸¶¨µÄ³¬Ê±Ê±¼ä£¬ÔÝʱ²»Í˳ö£¬Ã¿¸ô100MS¼ì²âÏÂÊÇ·ñÓÐеÄÈÎÎñ¼ÓÈ룬ÓÐÔò¼ÌÐøÖ´ÐУº

ÔÚconfirmShutdown·½·¨ÖУ¬¼ÐÔÓÁËһЩ¶ÔÒѾ·ÏÆúµÄshutdown£¨£©·½·¨µÄ´¦Àí£¬ÀýÈ磺

µ÷ÓÃеÄshutdownGracefullyϵÁз½·¨£¬¸ÃÅжÏÌõ¼þÊÇÓÀÔ¶¶¼²»»á³ÉÁ¢µÄ£¬Òò´Ë¶ÔÓÚÒѾ·ÏÆúµÄshutdownÏà¹ØµÄ´¦ÀíÂß¼£¬²»ÔÙÏêϸ·ÖÎö¡£

µ½´ËΪֹ£¬confirmShutdown·½·¨½²½âÍê±Ï£¬confirmShutdown·µ»Øtrue£¬ÔòNioEventLoopÏß³ÌÕýʽÍ˳ö£¬NettyµÄÓÅÑÅÍ˳öÍê³É£¬´úÂëÈçÏ£º
3.5. ÒÉÎʽâ´ð
3.5.1. runAllTasksÖØ¸´Ö´ÐÐÎÊÌâ
ÔÚNioEventLoopµÄrun·½·¨ÖУ¬ÒѾµ÷ÓÃÁËrunAllTasks·½·¨£¬ÎªºÎ½ôËæÆäºó£¬ÔÚconfirmShutdownÖÐÓмÌÐøµ÷ÓÃrunAllTasks·½·¨ÄØ£¬ÒÉÎÊ´úÂëÈçÏ£º

ÔÒòÖ÷ÒªÓÐÁ½¸ö£º
1£®ÎªÁË·ÀÖ¹¶¨Ê±ÈÎÎñTask»òÕßÓû§×Ô¶¨ÒåµÄÏß³ÌTaskµÄÖ´Ðйý¶àÕ¼ÓÃNioEventLoopÏ̵߳ĵ÷¶È×ÊÔ´£¬Netty¶ÔNioEventLoopÏß³ÌI/O²Ù×÷ºÍ·ÇI/O²Ù×÷ʱ¼ä×öÁ˱ÈÀýÏÞÖÆ£¬¼´ÏÞÖÆ·ÇI/O²Ù×÷µÄÖ´ÐÐʱ¼ä£¬ÈçÉÏͼºì¿òÖдúÂëËùʾ¡£ÓÐÁËÖ´ÐÐʱ¼äÏÞÖÆ£¬Òò´Ë¿ÉÄܻᵼÖÂÒѾµ½ÆÚµÄ¶¨Ê±ÈÎÎñ¡¢ÆÕͨÈÎÎñûÓÐÖ´ÐÐÍ꣬ÐèÒªµÈ´ýÏ´ÎSelectorÂÖѯ¼ÌÐøÖ´ÐС£ÔÚÏß³ÌÍ˳ö֮ǰ£¬ÐèÒª¶Ô±¾¸ÃÖ´Ðе«ÊÇûÓÐÖ´ÐÐÍê³ÉµÄTask½øÐÐɨβ´¦Àí£¬ËùÒÔÔÚconfirmShutdownÖÐÔٴε÷ÓÃÁËrunAllTasks·½·¨£»
2£®ÔÚµ÷ÓÃrunAllTasks·½·¨Ö®ºó£¬Ö´ÐÐconfirmShutdown֮ǰ£¬Óû§ÏòNioEventLoopÖÐÌí¼ÓÁËÐÂµÄÆÕͨÈÎÎñ»òÕß¶¨Ê±ÈÎÎñ£¬Òò´ËÐèÒªÔÚÍ˳ö֮ǰÔٴαéÀú²¢´¦ÀíÒ»±éTask
Queue¡£
3.5.2. ÓÅÑÅÍ˳öÊÇ·ñÄܹ»±£Ö¤ËùÓÐÔÚͨÐÅÏß³ÌÅŶӵÄÏûϢȫ²¿·¢Ëͳöȥʵ¼ÊÊÇÎÞ·¨±£Ö¤µÄ£¬ËüÖ»Äܱ£Ö¤Èç¹ûÏÖÔÚÕýÔÚ·¢ËÍÏûÏ¢¹ý³ÌÖУ¬µ÷ÓÃÁËÓÅÑÅÍ˳ö·½·¨£¬´Ëʱ²»»á¹Ø±ÕÁ´Â·£¬¼ÌÐø·¢ËÍ£¬Èç¹û·¢ËͲÙ×÷Íê³É£¬ÎÞÂÛÊÇ·ñ»¹ÓÐÏûÏ¢ÉÐδ·¢ËͳöÈ¥£¬ÔÚÏÂÒ»ÂÖSelectorµÄÂÖѯÖУ¬Á´Â·½«»á¹Ø±Õ£¬Ã»Óз¢ËÍÍê³ÉµÄÏûÏ¢½«»á±»¶ªÆú£¬ÉõÖÁÊǰë°üÏûÏ¢¡£ËüµÄ´¦ÀíÔÀíͼÈçÏ£º

ËüµÄÔÀí±È½Ï¸´ÔÓ£¬ÏÖ¶ÔÖ÷ÒªÂß¼´¦Àí½øÐнâ¶Á£º
µ÷ÓÃÓÅÑÅÍ˳öÖ®ºó£¬ÊÇ·ñ¹Ø±ÕÁ´Â·£¬Åжϱê×¼ÊÇinFlush0ÊÇ·ñΪtrue£¬Èç¹ûΪFalse£¬Ôò»áÖ´ÐÐÁ´Â·¹Ø±Õ²Ù×÷£»
Èç¹ûÓû§ÊÇÀàËÆÅúÁ¿·¢ËÍ£¬ÀýÈçÿ´ïµ½NÌõ»òÕß¶¨Ê±´¥·¢flush²Ù×÷£¬ÔòÔÚ´ËÆÚ¼äµ÷ÓÃÓÅÑÅÍ˳ö·½·¨£¬inFlush0ΪFalse£¬Á´Â·¹Ø±Õ£¬»ýѹµÄ´ý·¢ËÍÏûÏ¢»á±»¶ªÆúµô£»
Èç¹ûÓÅÑÅÍ˳öʱÁ´Â·ÕýºÃÔÚ·¢ËÍÏûÏ¢¹ý³ÌÖУ¬ÔòËü²»»áÁ¢¼´Í˳ö£¬µÈ´ý·¢ËÍÍê³ÉÖ®ºó£¬Ï´ÎSelectorÂÖѯµÄʱºò²ÅÍ˳ö¡£ÔÚÕâÖÖ³¡¾°Ï£¬ÓÖÓÐÁ½ÖÖ¿ÉÄܵij¡¾°£º
³¡¾°A£ºÈç¹ûÒ»´Î°Ñ»ýѹµÄÏûϢȫ²¿·¢ËÍÍ꣬ûÓз¢Éúд°ë°ü£¬Ôò²»»á·¢ÉúÏûÏ¢¶ªÊ§£»
³¡¾°B£ºÈç¹ûÒ»´ÎûÓаÑÏûÏ¢·¢ËÍÍê³É£¬´ËʱNetty»á¼àÌýдʼþ£¬´¥·¢SelectorµÄÏÂÒ»´ÎÂÖѯ²¢·¢ËÍÏûÏ¢£¬´úÂëÈçÏ£º

SelectorÂÖѯʱ£¬Ê×ÏÈ´¦Àí¶Áдʼþ£¬È»ºóÔÙ´¦Àí¶¨Ê±ÈÎÎñºÍÆÕͨÈÎÎñ£¬Òò´ËÔÚÁ´Â·¹Ø±Õ֮ǰ£¬»¹ÓÐ×îºóÒ»´Î¼ÌÐø·¢Ë͵Ļú»á£¬´úÂëÈçÏ£º

Èç¹û·Ç³£²»ÐÒ£¬Ôٴη¢ËÍÈÔȻûÓаѻýѹµÄÏûϢȫ²¿·¢ËÍÍê±Ï£¬Ôٴη¢ÉúÁËд°ë°ü£¬ÄÇÎÞÂÛÊÇ·ñÓлýѹÏûÏ¢£¬Ö´ÐÐAbstractUnsafe.closeµÄTask»¹ÊÇ»á°ÑÁ´Â·¸ø¹Ø±Õµô£¬ÔÒòÊÇÖ»ÒªÍê³ÉÒ»´ÎÏûÏ¢·¢ËͲÙ×÷£¬Netty¾Í»á°ÑinFlush0ÖÃΪfalse£¬´úÂëÈçÏ£º

Á´Â·¹Ø±ÕÖ®ºó£¬ËùÓÐÉÐδ·¢Ë͵ÄÏûÏ¢¶¼½«±»¶ªÆú¡£
¿ÉÄÜÓÐЩ¶ÁÕß»áÓÐÒÉÎÊ£¬Èç¹ûÔÚµÚ¶þ´Î·¢ËÍÖ®ºó£¬Ö´ÐÐAbstractUnsafe.close֮ǰ£¬ÒµÎñÕýºÃÓÖµ÷ÓÃÁËflush²Ù×÷£¬inFlush0ÊÇ·ñ»á±»Ð޸ijÉTrueÄØ£¿Õâ¸öÊDz»¿ÉÄܵģ¬ÒòΪ´ÓNetty
4.XÖ®ºóÏß³ÌÄ£ÐÍ·¢ÉúÁ˱ä¸ü£¬flush²Ù×÷²»ÊÇÓÉÓû§Ïß³ÌÖ´ÐУ¬¶øÊÇÓÉChannel¶ÔÓ¦µÄNioEventLoopÏß³ÌÖ´ÐУ¬ËùÒÔÔÚÁ½ÕßÖ®¼ä²»»á·¢ÉúinFlush0±»Ð޸ĵÄÇé¿ö¡£
Netty 4.XÖ®ºóµÄÏß³ÌÄ£ÐÍÈçÏÂËùʾ£º

ÁíÍ⣬ÓÉÓÚÓÅÑÅÍ˳öÓг¬Ê±Ê±¼ä£¬Èç¹ûÔÚ³¬Ê±Ê±¼äÄÚûÓÐÍê³É»ýѹÏûÏ¢µÄ·¢ËÍ£¬Ò²»á·¢ÉúÏûÏ¢¶ªÆúµÄÇé¿ö¡£
¶ÔÓÚÉÏÊö³¡¾°£¬ÐèÒªÓ¦ÓòãÀ´±£Ö¤Ïà¹ØµÄ¿É¿¿ÐÔ£¬»òÕß¶ÔNettyµÄÓÅÑÅÍ˳ö»úÖÆ½øÐÐÓÅ»¯¡£
|