List of usage examples for io.netty.channel EventLoopGroup shutdownGracefully
Future<?> shutdownGracefully();
From source file:com.lb.netty.protoc.SubReqServer.java
License:Apache License
public void bind(int port) throws Exception { // ??NIO// w w w .j ava 2s .c o m EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 100).handler(new LoggingHandler(LogLevel.INFO)) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) { ch.pipeline().addLast(new ProtobufVarint32FrameDecoder()); // protobuffer ch.pipeline().addLast( new ProtobufDecoder(SubscribeReqProto.SubscribeReq.getDefaultInstance())); ch.pipeline().addLast(new ProtobufVarint32LengthFieldPrepender()); ch.pipeline().addLast(new ProtobufEncoder()); ch.pipeline().addLast(new SubReqServerHandler()); } }); // ??? ChannelFuture f = b.bind(port).sync(); // ??? f.channel().closeFuture().sync(); } finally { // ? bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } }
From source file:com.lbwan.game.client.WebSocketClientRunner.java
License:Apache License
public void run() throws Exception { EventLoopGroup group = new NioEventLoopGroup(); try {/*from w w w .j a va2 s. co m*/ // Connect with V13 (RFC 6455 aka HyBi-17). You can change it to V08 or V00. // If you change it to V00, ping is not supported and remember to change // HttpResponseDecoder to WebSocketHttpResponseDecoder in the pipeline. final WebSocketClientHandler handler = new WebSocketClientHandler(WebSocketClientHandshakerFactory .newHandshaker(uri, WebSocketVersion.V13, null, false, new DefaultHttpHeaders())); final String protocol = uri.getScheme(); int defaultPort; ChannelInitializer<SocketChannel> initializer; // Normal WebSocket if ("ws".equals(protocol)) { initializer = new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast("http-codec", new HttpClientCodec()) .addLast("aggregator", new HttpObjectAggregator(8192)) .addLast("ws-handler", handler); } }; defaultPort = 80; // Secure WebSocket } else { throw new IllegalArgumentException("Unsupported protocol: " + protocol); } Bootstrap b = new Bootstrap(); b.group(group).channel(NioSocketChannel.class).handler(initializer); int port = uri.getPort(); // If no port was specified, we'll try the default port: https://tools.ietf.org/html/rfc6455#section-1.7 if (uri.getPort() == -1) { port = defaultPort; } Channel ch = b.connect(uri.getHost(), port).sync().channel(); handler.handshakeFuture().sync(); BufferedReader console = new BufferedReader(new InputStreamReader(System.in)); while (true) { String msg = console.readLine(); if (msg == null) { break; } else if ("bye".equals(msg.toLowerCase())) { ch.writeAndFlush(new CloseWebSocketFrame()); ch.closeFuture().sync(); break; } else if ("ping".equals(msg.toLowerCase())) { WebSocketFrame frame = new PingWebSocketFrame(Unpooled.copiedBuffer(new byte[] { 8, 1, 8, 1 })); ch.writeAndFlush(frame); } else { WebSocketFrame frame = new TextWebSocketFrame(msg); ch.writeAndFlush(frame); } } } finally { group.shutdownGracefully(); } }
From source file:com.leadtone.riders.server.RidersWebSocketServer.java
License:Apache License
public void start() throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try {// ww w. ja v a 2 s . co m ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(serverInitializer); Channel ch = b.bind(port).sync().channel(); log.info("Web socket server started at port " + port + '.'); log.info("Open your browser and navigate to http://localhost:" + port + '/'); ch.closeFuture().sync(); } finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } }
From source file:com.lin.studytest.netty.server.EchoServer.java
License:Apache License
public static void main(String[] args) throws Exception { // Configure the server. EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try {/*from ww w .j a v a 2 s. co m*/ ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) // .option(ChannelOption.SO_BACKLOG, 100) // .handler(new LoggingHandler(LogLevel.INFO)) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline p = ch.pipeline(); p.addLast(new EchoServerHandler()); } }); // Start the server. ChannelFuture f = b.bind(PORT).sync(); // Wait until the server socket is closed. f.channel().closeFuture().sync(); } finally { // Shut down all event loops to terminate all threads. bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } }
From source file:com.linecorp.armeria.server.Server.java
License:Apache License
private void stop1(CompletableFuture<Void> future, EventLoopGroup bossGroup) { // FIXME(trustin): Shutdown and terminate the blockingTaskExecutor. // Could be fixed while fixing https://github.com/line/armeria/issues/46 final Future<?> bossShutdownFuture; if (bossGroup != null) { bossShutdownFuture = bossGroup.shutdownGracefully(); this.bossGroup = null; } else {/*w w w .ja v a 2 s. com*/ bossShutdownFuture = ImmediateEventExecutor.INSTANCE.newSucceededFuture(null); } bossShutdownFuture.addListener(f1 -> { // All server ports have been unbound. primaryActivePort = null; activePorts.clear(); // Shut down the workers. final EventLoopGroup workerGroup = this.workerGroup; final Future<?> workerShutdownFuture; if (workerGroup != null) { workerShutdownFuture = workerGroup.shutdownGracefully(); this.workerGroup = null; } else { workerShutdownFuture = ImmediateEventExecutor.INSTANCE.newSucceededFuture(null); } workerShutdownFuture.addListener(f2 -> { stateManager.enter(State.STOPPED); completeFuture(future); }); }); }
From source file:com.linkedin.pinot.transport.scattergather.ScatterGatherTest.java
License:Apache License
@Test public void testSingleServer() throws Exception { MetricsRegistry registry = new MetricsRegistry(); // Server start int serverPort = 7071; NettyTCPServer server1 = new NettyTCPServer(serverPort, new TestRequestHandlerFactory(0, 1), null); Thread t1 = new Thread(server1); t1.start();//from ww w .j av a 2 s . c o m //Client setup ScheduledExecutorService timedExecutor = new ScheduledThreadPoolExecutor(1); ExecutorService poolExecutor = MoreExecutors.sameThreadExecutor(); ExecutorService service = new ThreadPoolExecutor(1, 1, 1, TimeUnit.DAYS, new LinkedBlockingDeque<Runnable>()); EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); NettyClientMetrics clientMetrics = new NettyClientMetrics(registry, "client_"); PooledNettyClientResourceManager rm = new PooledNettyClientResourceManager(eventLoopGroup, new HashedWheelTimer(), clientMetrics); KeyedPoolImpl<ServerInstance, NettyClientConnection> pool = new KeyedPoolImpl<ServerInstance, NettyClientConnection>( 1, 1, 300000, 1, rm, timedExecutor, poolExecutor, registry); rm.setPool(pool); ScatterGatherImpl scImpl = new ScatterGatherImpl(pool, service); SegmentIdSet pg = new SegmentIdSet(); pg.addSegment(new SegmentId("0")); ServerInstance serverInstance1 = new ServerInstance("localhost", serverPort); List<ServerInstance> instances = new ArrayList<ServerInstance>(); instances.add(serverInstance1); Map<ServerInstance, SegmentIdSet> pgMap = new HashMap<ServerInstance, SegmentIdSet>(); pgMap.put(serverInstance1, pg); String request = "request_0"; Map<SegmentIdSet, String> pgMapStr = new HashMap<SegmentIdSet, String>(); pgMapStr.put(pg, request); ScatterGatherRequest req = new TestScatterGatherRequest(pgMap, pgMapStr); CompositeFuture<ServerInstance, ByteBuf> fut = scImpl.scatterGather(req); Map<ServerInstance, ByteBuf> v = fut.get(); ByteBuf b = v.get(serverInstance1); byte[] b2 = new byte[b.readableBytes()]; b.readBytes(b2); String response = new String(b2); Assert.assertEquals(response, "response_0_0"); Assert.assertEquals(v.size(), 1); server1.shutdownGracefully(); pool.shutdown(); service.shutdown(); eventLoopGroup.shutdownGracefully(); }
From source file:com.linkedin.pinot.transport.scattergather.ScatterGatherTest.java
License:Apache License
@Test public void testMultipleServerHappy() throws Exception { MetricsRegistry registry = new MetricsRegistry(); // Server start int serverPort1 = 7071; int serverPort2 = 7072; int serverPort3 = 7073; int serverPort4 = 7074; NettyTCPServer server1 = new NettyTCPServer(serverPort1, new TestRequestHandlerFactory(0, 1), null); NettyTCPServer server2 = new NettyTCPServer(serverPort2, new TestRequestHandlerFactory(1, 1), null); NettyTCPServer server3 = new NettyTCPServer(serverPort3, new TestRequestHandlerFactory(2, 1), null); NettyTCPServer server4 = new NettyTCPServer(serverPort4, new TestRequestHandlerFactory(3, 1), null); Thread t1 = new Thread(server1); Thread t2 = new Thread(server2); Thread t3 = new Thread(server3); Thread t4 = new Thread(server4); t1.start();/* w w w. ja v a2s . c o m*/ t2.start(); t3.start(); t4.start(); //Client setup ScheduledExecutorService timedExecutor = new ScheduledThreadPoolExecutor(1); ExecutorService poolExecutor = MoreExecutors.sameThreadExecutor(); ExecutorService service = new ThreadPoolExecutor(1, 1, 1, TimeUnit.DAYS, new LinkedBlockingDeque<Runnable>()); EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); NettyClientMetrics clientMetrics = new NettyClientMetrics(registry, "client_"); PooledNettyClientResourceManager rm = new PooledNettyClientResourceManager(eventLoopGroup, new HashedWheelTimer(), clientMetrics); KeyedPoolImpl<ServerInstance, NettyClientConnection> pool = new KeyedPoolImpl<ServerInstance, NettyClientConnection>( 1, 1, 300000, 1, rm, timedExecutor, poolExecutor, registry); rm.setPool(pool); SegmentIdSet pg1 = new SegmentIdSet(); pg1.addSegment(new SegmentId("0")); SegmentIdSet pg2 = new SegmentIdSet(); pg2.addSegment(new SegmentId("1")); SegmentIdSet pg3 = new SegmentIdSet(); pg3.addSegment(new SegmentId("2")); SegmentIdSet pg4 = new SegmentIdSet(); pg4.addSegment(new SegmentId("3")); ServerInstance serverInstance1 = new ServerInstance("localhost", serverPort1); ServerInstance serverInstance2 = new ServerInstance("localhost", serverPort2); ServerInstance serverInstance3 = new ServerInstance("localhost", serverPort3); ServerInstance serverInstance4 = new ServerInstance("localhost", serverPort4); Map<ServerInstance, SegmentIdSet> pgMap = new HashMap<ServerInstance, SegmentIdSet>(); pgMap.put(serverInstance1, pg1); pgMap.put(serverInstance2, pg2); pgMap.put(serverInstance3, pg3); pgMap.put(serverInstance4, pg4); String request1 = "request_0"; String request2 = "request_1"; String request3 = "request_2"; String request4 = "request_3"; Map<SegmentIdSet, String> pgMapStr = new HashMap<SegmentIdSet, String>(); pgMapStr.put(pg1, request1); pgMapStr.put(pg2, request2); pgMapStr.put(pg3, request3); pgMapStr.put(pg4, request4); ScatterGatherRequest req = new TestScatterGatherRequest(pgMap, pgMapStr); ScatterGatherImpl scImpl = new ScatterGatherImpl(pool, service); CompositeFuture<ServerInstance, ByteBuf> fut = scImpl.scatterGather(req); Map<ServerInstance, ByteBuf> v = fut.get(); Assert.assertEquals(v.size(), 4); ByteBuf b = v.get(serverInstance1); byte[] b2 = new byte[b.readableBytes()]; b.readBytes(b2); String response = new String(b2); Assert.assertEquals(response, "response_0_0"); b = v.get(serverInstance2); b2 = new byte[b.readableBytes()]; b.readBytes(b2); response = new String(b2); Assert.assertEquals(response, "response_1_0"); b = v.get(serverInstance3); b2 = new byte[b.readableBytes()]; b.readBytes(b2); response = new String(b2); Assert.assertEquals(response, "response_2_0"); b = v.get(serverInstance4); b2 = new byte[b.readableBytes()]; b.readBytes(b2); response = new String(b2); Assert.assertEquals(response, "response_3_0"); server1.shutdownGracefully(); server2.shutdownGracefully(); server3.shutdownGracefully(); server4.shutdownGracefully(); pool.shutdown(); service.shutdown(); eventLoopGroup.shutdownGracefully(); }
From source file:com.linkedin.pinot.transport.scattergather.ScatterGatherTest.java
License:Apache License
@Test public void testMultipleServerTimeout() throws Exception { MetricsRegistry registry = new MetricsRegistry(); // Server start int serverPort1 = 7081; int serverPort2 = 7082; int serverPort3 = 7083; int serverPort4 = 7084; // Timeout server NettyTCPServer server1 = new NettyTCPServer(serverPort1, new TestRequestHandlerFactory(0, 1), null); NettyTCPServer server2 = new NettyTCPServer(serverPort2, new TestRequestHandlerFactory(1, 1), null); NettyTCPServer server3 = new NettyTCPServer(serverPort3, new TestRequestHandlerFactory(2, 1), null); NettyTCPServer server4 = new NettyTCPServer(serverPort4, new TestRequestHandlerFactory(3, 1, 7000, false), null);// w w w .ja va 2s . com Thread t1 = new Thread(server1); Thread t2 = new Thread(server2); Thread t3 = new Thread(server3); Thread t4 = new Thread(server4); t1.start(); t2.start(); t3.start(); t4.start(); //Client setup ScheduledExecutorService timedExecutor = new ScheduledThreadPoolExecutor(1); ExecutorService service = new ThreadPoolExecutor(5, 5, 5, TimeUnit.DAYS, new LinkedBlockingDeque<Runnable>()); EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); NettyClientMetrics clientMetrics = new NettyClientMetrics(registry, "client_"); PooledNettyClientResourceManager rm = new PooledNettyClientResourceManager(eventLoopGroup, new HashedWheelTimer(), clientMetrics); KeyedPoolImpl<ServerInstance, NettyClientConnection> pool = new KeyedPoolImpl<ServerInstance, NettyClientConnection>( 1, 1, 300000, 1, rm, timedExecutor, service, registry); rm.setPool(pool); SegmentIdSet pg1 = new SegmentIdSet(); pg1.addSegment(new SegmentId("0")); SegmentIdSet pg2 = new SegmentIdSet(); pg2.addSegment(new SegmentId("1")); SegmentIdSet pg3 = new SegmentIdSet(); pg3.addSegment(new SegmentId("2")); SegmentIdSet pg4 = new SegmentIdSet(); pg4.addSegment(new SegmentId("3")); ServerInstance serverInstance1 = new ServerInstance("localhost", serverPort1); ServerInstance serverInstance2 = new ServerInstance("localhost", serverPort2); ServerInstance serverInstance3 = new ServerInstance("localhost", serverPort3); ServerInstance serverInstance4 = new ServerInstance("localhost", serverPort4); Map<ServerInstance, SegmentIdSet> pgMap = new HashMap<ServerInstance, SegmentIdSet>(); pgMap.put(serverInstance1, pg1); pgMap.put(serverInstance2, pg2); pgMap.put(serverInstance3, pg3); pgMap.put(serverInstance4, pg4); String request1 = "request_0"; String request2 = "request_1"; String request3 = "request_2"; String request4 = "request_3"; Map<SegmentIdSet, String> pgMapStr = new HashMap<SegmentIdSet, String>(); pgMapStr.put(pg1, request1); pgMapStr.put(pg2, request2); pgMapStr.put(pg3, request3); pgMapStr.put(pg4, request4); ScatterGatherRequest req = new TestScatterGatherRequest(pgMap, pgMapStr, new RoundRobinReplicaSelection(), ReplicaSelectionGranularity.SEGMENT_ID_SET, 0, 1000); ScatterGatherImpl scImpl = new ScatterGatherImpl(pool, service); CompositeFuture<ServerInstance, ByteBuf> fut = scImpl.scatterGather(req); Map<ServerInstance, ByteBuf> v = fut.get(); //Only 3 servers return value. Assert.assertEquals(v.size(), 3); ByteBuf b = v.get(serverInstance1); byte[] b2 = new byte[b.readableBytes()]; b.readBytes(b2); String response = new String(b2); Assert.assertEquals(response, "response_0_0"); b = v.get(serverInstance2); b2 = new byte[b.readableBytes()]; b.readBytes(b2); response = new String(b2); Assert.assertEquals(response, "response_1_0"); b = v.get(serverInstance3); b2 = new byte[b.readableBytes()]; b.readBytes(b2); response = new String(b2); Assert.assertEquals(response, "response_2_0"); //No response from 4th server Assert.assertNull(v.get(serverInstance4), "No response from 4th server"); Map<ServerInstance, Throwable> errorMap = fut.getError(); Assert.assertEquals(errorMap.size(), 1, "One error"); Assert.assertNotNull(errorMap.get(serverInstance4), "Server4 returned timeout"); System.out.println("Error is :" + errorMap.get(serverInstance4)); Thread.sleep(3000); System.out.println("Pool Stats :" + pool.getStats()); pool.getStats().refresh(); Assert.assertEquals(pool.getStats().getTotalBadDestroyed(), 1, "Total Bad destroyed"); pool.shutdown(); service.shutdown(); eventLoopGroup.shutdownGracefully(); server1.shutdownGracefully(); server2.shutdownGracefully(); server3.shutdownGracefully(); server4.shutdownGracefully(); }
From source file:com.linkedin.pinot.transport.scattergather.ScatterGatherTest.java
License:Apache License
@Test public void testMultipleServerError() throws Exception { MetricsRegistry registry = new MetricsRegistry(); // Server start int serverPort1 = 7091; int serverPort2 = 7092; int serverPort3 = 7093; int serverPort4 = 7094; // error server NettyTCPServer server1 = new NettyTCPServer(serverPort1, new TestRequestHandlerFactory(0, 1), null); NettyTCPServer server2 = new NettyTCPServer(serverPort2, new TestRequestHandlerFactory(1, 1), null); NettyTCPServer server3 = new NettyTCPServer(serverPort3, new TestRequestHandlerFactory(2, 1), null); NettyTCPServer server4 = new NettyTCPServer(serverPort4, new TestRequestHandlerFactory(3, 1, 1000, true), null);//from w w w .j av a 2 s. c om Thread t1 = new Thread(server1); Thread t2 = new Thread(server2); Thread t3 = new Thread(server3); Thread t4 = new Thread(server4); t1.start(); t2.start(); t3.start(); t4.start(); //Client setup ScheduledExecutorService timedExecutor = new ScheduledThreadPoolExecutor(1); ExecutorService poolExecutor = MoreExecutors.sameThreadExecutor(); ExecutorService service = new ThreadPoolExecutor(1, 1, 1, TimeUnit.DAYS, new LinkedBlockingDeque<Runnable>()); EventLoopGroup eventLoopGroup = new NioEventLoopGroup(); NettyClientMetrics clientMetrics = new NettyClientMetrics(registry, "client_"); PooledNettyClientResourceManager rm = new PooledNettyClientResourceManager(eventLoopGroup, new HashedWheelTimer(), clientMetrics); KeyedPoolImpl<ServerInstance, NettyClientConnection> pool = new KeyedPoolImpl<ServerInstance, NettyClientConnection>( 1, 1, 300000, 1, rm, timedExecutor, poolExecutor, registry); rm.setPool(pool); SegmentIdSet pg1 = new SegmentIdSet(); pg1.addSegment(new SegmentId("0")); SegmentIdSet pg2 = new SegmentIdSet(); pg2.addSegment(new SegmentId("1")); SegmentIdSet pg3 = new SegmentIdSet(); pg3.addSegment(new SegmentId("2")); SegmentIdSet pg4 = new SegmentIdSet(); pg4.addSegment(new SegmentId("3")); ServerInstance serverInstance1 = new ServerInstance("localhost", serverPort1); ServerInstance serverInstance2 = new ServerInstance("localhost", serverPort2); ServerInstance serverInstance3 = new ServerInstance("localhost", serverPort3); ServerInstance serverInstance4 = new ServerInstance("localhost", serverPort4); Map<ServerInstance, SegmentIdSet> pgMap = new HashMap<ServerInstance, SegmentIdSet>(); pgMap.put(serverInstance1, pg1); pgMap.put(serverInstance2, pg2); pgMap.put(serverInstance3, pg3); pgMap.put(serverInstance4, pg4); String request1 = "request_0"; String request2 = "request_1"; String request3 = "request_2"; String request4 = "request_3"; Map<SegmentIdSet, String> pgMapStr = new HashMap<SegmentIdSet, String>(); pgMapStr.put(pg1, request1); pgMapStr.put(pg2, request2); pgMapStr.put(pg3, request3); pgMapStr.put(pg4, request4); ScatterGatherRequest req = new TestScatterGatherRequest(pgMap, pgMapStr, new RoundRobinReplicaSelection(), ReplicaSelectionGranularity.SEGMENT_ID_SET, 0, 1000); ScatterGatherImpl scImpl = new ScatterGatherImpl(pool, service); CompositeFuture<ServerInstance, ByteBuf> fut = scImpl.scatterGather(req); Map<ServerInstance, ByteBuf> v = fut.get(); //Only 3 servers return value. Assert.assertEquals(v.size(), 3); ByteBuf b = v.get(serverInstance1); byte[] b2 = new byte[b.readableBytes()]; b.readBytes(b2); String response = new String(b2); Assert.assertEquals(response, "response_0_0"); b = v.get(serverInstance2); b2 = new byte[b.readableBytes()]; b.readBytes(b2); response = new String(b2); Assert.assertEquals(response, "response_1_0"); b = v.get(serverInstance3); b2 = new byte[b.readableBytes()]; b.readBytes(b2); response = new String(b2); Assert.assertEquals(response, "response_2_0"); //No response from 4th server Assert.assertNull(v.get(serverInstance4), "No response from 4th server"); Map<ServerInstance, Throwable> errorMap = fut.getError(); Assert.assertEquals(errorMap.size(), 1, "One error"); Assert.assertNotNull(errorMap.get(serverInstance4), "Server4 returned timeout"); System.out.println("Error is :" + errorMap.get(serverInstance4)); Thread.sleep(3000); System.out.println("Pool Stats :" + pool.getStats()); pool.getStats().refresh(); Assert.assertEquals(pool.getStats().getTotalBadDestroyed(), 1, "Total Bad destroyed"); pool.shutdown(); service.shutdown(); eventLoopGroup.shutdownGracefully(); server1.shutdownGracefully(); server2.shutdownGracefully(); server3.shutdownGracefully(); server4.shutdownGracefully(); }
From source file:com.liusu.tcp.proxy.mine.server.ReadBackServer.java
License:Apache License
public void bind(int port) throws Exception { // ??NIO//from w ww . ja va 2 s . c o m EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) .option(ChannelOption.SO_BACKLOG, 1024).childHandler(new ChildChannelHandler()); // ??? ChannelFuture f = b.bind(port).sync(); // f.addListener(ChannelFutureListener.CLOSE); // ??? f.channel().closeFuture().sync(); } finally { // ? bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } }