Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
NettyÓÅÑÅÍ˳ö»úÖÆºÍÔ­Àí
 
×÷ÕߣºÀîÁÖ·æ À´Ô´£ºinfoQ ·¢²¼ÓÚ 2016-8-5
  2338  次浏览      29
 

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Ïà¹ØµÄ×ÊÔ´£º

ctx.channel().close();

³ý·ÇÊÇÕû¸ö½ø³ÌÓÅÑÅÍ˳ö£¬Ò»°ãÇé¿öϲ»»áµ÷ÓÃ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µÄÓÅÑÅÍ˳ö»úÖÆ½øÐÐÓÅ»¯¡£

   
2338 ´Îä¯ÀÀ       29
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]

Java ÖеÄÖÐÎıàÂëÎÊÌâ
Java»ù´¡ÖªÊ¶µÄÈýÊ®¸ö¾­µäÎÊ´ð
Íæ×ª Java Web Ó¦Óÿª·¢
ʹÓÃSpring¸üºÃµØ´¦ÀíStruts
ÓÃEclipse¿ª·¢iPhone WebÓ¦ÓÃ
²å¼þϵͳ¿ò¼Ü·ÖÎö

Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ

Struts+Spring+Hibernate/EJB+ÐÔÄÜÓÅ»¯
»ªÏÄ»ù½ð ActiveMQ Ô­ÀíÓë¹ÜÀí
ijÃñº½¹«Ë¾ Java»ù´¡±à³Ìµ½Ó¦Óÿª·¢
ij·çµç¹«Ë¾ Java Ó¦Óÿª·¢Æ½Ì¨ÓëÇ¨ÒÆ
ÈÕÕÕ¸Û J2EEÓ¦Óÿª·¢¼¼Êõ¿ò¼ÜÓëʵ¼ù
ij¿ç¹ú¹«Ë¾ ¹¤×÷Á÷¹ÜÀíJBPM
¶«·½º½¿Õ¹«Ë¾ ¸ß¼¶J2EE¼°ÆäÇ°ÑØ¼¼Êõ