HelloWebServer.java 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package hello;
  2. import java.net.InetSocketAddress;
  3. import hello.loom.HelloLoomServerInitializer;
  4. import hello.loom.LoomSupport;
  5. import hello.loom.MultithreadVirtualEventExecutorGroup;
  6. import io.netty.bootstrap.ServerBootstrap;
  7. import io.netty.channel.Channel;
  8. import io.netty.channel.ChannelOption;
  9. import io.netty.channel.epoll.EpollChannelOption;
  10. import io.netty.channel.uring.IoUringChannelOption;
  11. import io.netty.util.ResourceLeakDetector;
  12. import io.netty.util.ResourceLeakDetector.Level;
  13. public class HelloWebServer {
  14. private static final boolean EVENT_LOOP_CARRIER = Boolean.getBoolean("hello.eventloop.carrier");
  15. private static final IoMultiplexer PREFERRED_TRANSPORT;
  16. static {
  17. ResourceLeakDetector.setLevel(Level.DISABLED);
  18. String transportName = System.getProperty("hello.transport");
  19. if (transportName != null) {
  20. try {
  21. PREFERRED_TRANSPORT = IoMultiplexer.valueOf(transportName);
  22. } catch (IllegalArgumentException e) {
  23. System.err.println("Invalid transport name: " + transportName);
  24. throw e;
  25. }
  26. } else {
  27. PREFERRED_TRANSPORT = IoMultiplexer.type();
  28. }
  29. }
  30. private final int port;
  31. public HelloWebServer(int port) {
  32. this.port = port;
  33. }
  34. public void run() throws Exception {
  35. final var preferredTransport = PREFERRED_TRANSPORT;
  36. System.out.printf("Using %s IoMultiplexer%n", preferredTransport);
  37. final int coreCount = Runtime.getRuntime().availableProcessors();
  38. final var group = EVENT_LOOP_CARRIER?
  39. preferredTransport.newVirtualEventExecutorGroup(coreCount) :
  40. preferredTransport.newEventLoopGroup(coreCount);
  41. if (EVENT_LOOP_CARRIER) {
  42. LoomSupport.checkSupported();
  43. System.out.println("Using EventLoop optimized for Loom");
  44. }
  45. try {
  46. final var serverChannelClass = preferredTransport.serverChannelClass();
  47. var inet = new InetSocketAddress(port);
  48. var b = new ServerBootstrap();
  49. b.option(ChannelOption.SO_BACKLOG, 8192);
  50. b.option(ChannelOption.SO_REUSEADDR, true);
  51. switch (preferredTransport) {
  52. case EPOLL:
  53. b.option(EpollChannelOption.SO_REUSEPORT, true);
  54. break;
  55. case IO_URING:
  56. b.option(IoUringChannelOption.SO_REUSEPORT, true);
  57. break;
  58. }
  59. var channelB = b.group(group).channel(serverChannelClass);
  60. if (EVENT_LOOP_CARRIER) {
  61. channelB.childHandler(new HelloLoomServerInitializer((MultithreadVirtualEventExecutorGroup) group, group.next()));
  62. } else {
  63. channelB.childHandler(new HelloServerInitializer(group.next()));
  64. }
  65. b.childOption(ChannelOption.SO_REUSEADDR, true);
  66. Channel ch = b.bind(inet).sync().channel();
  67. System.out.printf("Httpd started. Listening on: %s%n", inet);
  68. ch.closeFuture().sync();
  69. } finally {
  70. group.shutdownGracefully().sync();
  71. }
  72. }
  73. public static void main(String[] args) throws Exception {
  74. int port;
  75. if (args.length > 0) {
  76. port = Integer.parseInt(args[0]);
  77. } else {
  78. port = 8080;
  79. }
  80. new HelloWebServer(port).run();
  81. }
  82. }