12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- package hello;
- import java.net.InetSocketAddress;
- import hello.loom.HelloLoomServerInitializer;
- import hello.loom.LoomSupport;
- import hello.loom.MultithreadVirtualEventExecutorGroup;
- import io.netty.bootstrap.ServerBootstrap;
- import io.netty.channel.Channel;
- import io.netty.channel.ChannelOption;
- import io.netty.channel.epoll.EpollChannelOption;
- import io.netty.channel.uring.IoUringChannelOption;
- import io.netty.util.ResourceLeakDetector;
- import io.netty.util.ResourceLeakDetector.Level;
- public class HelloWebServer {
- private static final boolean EVENT_LOOP_CARRIER = Boolean.getBoolean("hello.eventloop.carrier");
- private static final IoMultiplexer PREFERRED_TRANSPORT;
- static {
- ResourceLeakDetector.setLevel(Level.DISABLED);
- String transportName = System.getProperty("hello.transport");
- if (transportName != null) {
- try {
- PREFERRED_TRANSPORT = IoMultiplexer.valueOf(transportName);
- } catch (IllegalArgumentException e) {
- System.err.println("Invalid transport name: " + transportName);
- throw e;
- }
- } else {
- PREFERRED_TRANSPORT = IoMultiplexer.type();
- }
- }
- private final int port;
- public HelloWebServer(int port) {
- this.port = port;
- }
- public void run() throws Exception {
- final var preferredTransport = PREFERRED_TRANSPORT;
- System.out.printf("Using %s IoMultiplexer%n", preferredTransport);
- final int coreCount = Runtime.getRuntime().availableProcessors();
- final var group = EVENT_LOOP_CARRIER?
- preferredTransport.newVirtualEventExecutorGroup(coreCount) :
- preferredTransport.newEventLoopGroup(coreCount);
- if (EVENT_LOOP_CARRIER) {
- LoomSupport.checkSupported();
- System.out.println("Using EventLoop optimized for Loom");
- }
- try {
- final var serverChannelClass = preferredTransport.serverChannelClass();
- var inet = new InetSocketAddress(port);
- var b = new ServerBootstrap();
- b.option(ChannelOption.SO_BACKLOG, 8192);
- b.option(ChannelOption.SO_REUSEADDR, true);
- switch (preferredTransport) {
- case EPOLL:
- b.option(EpollChannelOption.SO_REUSEPORT, true);
- break;
- case IO_URING:
- b.option(IoUringChannelOption.SO_REUSEPORT, true);
- break;
- }
- var channelB = b.group(group).channel(serverChannelClass);
- if (EVENT_LOOP_CARRIER) {
- channelB.childHandler(new HelloLoomServerInitializer((MultithreadVirtualEventExecutorGroup) group, group.next()));
- } else {
- channelB.childHandler(new HelloServerInitializer(group.next()));
- }
- b.childOption(ChannelOption.SO_REUSEADDR, true);
- Channel ch = b.bind(inet).sync().channel();
- System.out.printf("Httpd started. Listening on: %s%n", inet);
- ch.closeFuture().sync();
- } finally {
- group.shutdownGracefully().sync();
- }
- }
- public static void main(String[] args) throws Exception {
- int port;
- if (args.length > 0) {
- port = Integer.parseInt(args[0]);
- } else {
- port = 8080;
- }
- new HelloWebServer(port).run();
- }
- }
|