11package com .github .netty .core ;
22
3- import com .github .netty .core .util .*;
3+ import com .github .netty .core .util .LoggerFactoryX ;
4+ import com .github .netty .core .util .LoggerX ;
5+ import com .github .netty .core .util .NamespaceUtil ;
6+ import com .github .netty .core .util .ThreadFactoryX ;
47import io .netty .bootstrap .ChannelFactory ;
58import io .netty .bootstrap .ServerBootstrap ;
69import io .netty .buffer .ByteBufAllocator ;
710import io .netty .channel .*;
811import io .netty .channel .epoll .Epoll ;
912import io .netty .channel .epoll .EpollEventLoopGroup ;
1013import io .netty .channel .epoll .EpollServerSocketChannel ;
14+ import io .netty .channel .kqueue .KQueue ;
15+ import io .netty .channel .kqueue .KQueueEventLoopGroup ;
16+ import io .netty .channel .kqueue .KQueueServerSocketChannel ;
1117import io .netty .channel .nio .NioEventLoopGroup ;
1218import io .netty .channel .socket .ServerSocketChannel ;
1319import io .netty .channel .socket .nio .NioServerSocketChannel ;
2531 * @author wangzihao
2632 */
2733public abstract class AbstractNettyServer implements Runnable {
34+ private static final boolean SUPPORT_KQUEUE ;
35+
36+ static {
37+ boolean kqueue ;
38+ try {
39+ ClassLoader classLoader = AbstractNettyServer .class .getClassLoader ();
40+ if (classLoader == null ) {
41+ classLoader = ClassLoader .getSystemClassLoader ();
42+ }
43+ Class .forName ("io.netty.channel.kqueue.KQueue" , false , classLoader );
44+ kqueue = true ;
45+ } catch (Throwable e ) {
46+ kqueue = false ;
47+ }
48+ SUPPORT_KQUEUE = kqueue ;
49+ }
50+
2851 private final boolean enableEpoll ;
52+ private final boolean enableKQueue ;
2953 protected LoggerX logger = LoggerFactoryX .getLogger (getClass ());
3054 private final String name ;
3155 private ServerSocketChannel serverChannel ;
@@ -50,11 +74,21 @@ public AbstractNettyServer(InetSocketAddress address) {
5074
5175 public AbstractNettyServer (String preName , InetSocketAddress address ) {
5276 super ();
53- this .enableEpoll = Epoll .isAvailable ();
77+ boolean enableEpoll = false ;
78+ boolean enableKQueue = false ;
79+ if (Epoll .isAvailable ()) {
80+ enableEpoll = true ;
81+ } else if (SUPPORT_KQUEUE && KQueue .isAvailable ()) {
82+ enableKQueue = true ;
83+ }
84+ this .enableEpoll = enableEpoll ;
85+ this .enableKQueue = enableKQueue ;
5486 this .serverAddress = address ;
5587 this .name = NamespaceUtil .newIdName (preName , getClass ());
5688 if (enableEpoll ) {
5789 logger .info ("enable epoll server = {}" , this );
90+ } else if (enableKQueue ) {
91+ logger .info ("enable kqueue server = {}" , this );
5892 }
5993 }
6094
@@ -66,7 +100,9 @@ public void setIoRatio(int ioRatio) {
66100 if (worker instanceof NioEventLoopGroup ) {
67101 ((NioEventLoopGroup ) worker ).setIoRatio (ioRatio );
68102 } else if (worker instanceof EpollEventLoopGroup ) {
69- // ((EpollEventLoopGroup) worker).setIoRatio(ioRatio);
103+ ((EpollEventLoopGroup ) worker ).setIoRatio (ioRatio );
104+ } else if (worker instanceof KQueueEventLoopGroup ) {
105+ ((KQueueEventLoopGroup ) worker ).setIoRatio (ioRatio );
70106 }
71107 this .ioRatio = ioRatio ;
72108 }
@@ -92,7 +128,13 @@ protected ServerBootstrap newServerBootstrap() {
92128 protected EventLoopGroup newWorkerEventLoopGroup () {
93129 EventLoopGroup worker ;
94130 if (enableEpoll ) {
95- worker = new EpollEventLoopGroup (ioThreadCount , new ThreadFactoryX ("Epoll" , "Server-Worker" , false ));
131+ EpollEventLoopGroup epollWorker = new EpollEventLoopGroup (ioThreadCount , new ThreadFactoryX ("Epoll" , "Server-Worker" , false ));
132+ epollWorker .setIoRatio (ioRatio );
133+ worker = epollWorker ;
134+ } else if (enableKQueue ) {
135+ KQueueEventLoopGroup kqueueWorker = new KQueueEventLoopGroup (ioThreadCount , new ThreadFactoryX ("Kqueue" , "Server-Worker" , false ));
136+ kqueueWorker .setIoRatio (ioRatio );
137+ worker = kqueueWorker ;
96138 } else {
97139 NioEventLoopGroup jdkWorker = new NioEventLoopGroup (ioThreadCount , new ThreadFactoryX ("NIO" , "Server-Worker" , false ));
98140 jdkWorker .setIoRatio (ioRatio );
@@ -104,13 +146,11 @@ protected EventLoopGroup newWorkerEventLoopGroup() {
104146 protected EventLoopGroup newBossEventLoopGroup () {
105147 EventLoopGroup boss ;
106148 if (enableEpoll ) {
107- EpollEventLoopGroup epollBoss = new EpollEventLoopGroup (1 , new ThreadFactoryX ("Epoll" , "Server-Boss" , false ));
108- // epollBoss.setIoRatio(ioRatio);
109- boss = epollBoss ;
149+ boss = new EpollEventLoopGroup (1 , new ThreadFactoryX ("Epoll" , "Server-Boss" , false ));
150+ } else if ( enableKQueue ) {
151+ boss = new KQueueEventLoopGroup ( 1 , new ThreadFactoryX ( "Kqueue" , "Server-Boss" , false )) ;
110152 } else {
111- NioEventLoopGroup jdkBoss = new NioEventLoopGroup (1 , new ThreadFactoryX ("NIO" , "Server-Boss" , false ));
112- jdkBoss .setIoRatio (ioRatio );
113- boss = jdkBoss ;
153+ boss = new NioEventLoopGroup (1 , new ThreadFactoryX ("NIO" , "Server-Boss" , false ));
114154 }
115155 return boss ;
116156 }
@@ -127,6 +167,8 @@ protected ChannelFactory<? extends ServerChannel> newServerChannelFactory() {
127167 ChannelFactory <? extends ServerChannel > channelFactory ;
128168 if (enableEpoll ) {
129169 channelFactory = EpollServerSocketChannel ::new ;
170+ } else if (enableKQueue ) {
171+ channelFactory = KQueueServerSocketChannel ::new ;
130172 } else {
131173 channelFactory = NioServerSocketChannel ::new ;
132174 }
0 commit comments