Shutting down netty 4 application throws RejectedExecutionException

匿名 (未验证) 提交于 2019-12-03 01:00:01

问题:

let's assume the following pipeline:

pipeline.addLast(MY_STATELESS_DECODER); pipeline.addLast(SHARED_EVENT_EXECUTOR, MY_STATELESS_BUSINESS_LOGIC_HANDLER); 

I registered a ShutdownHook which shuts the NettyServer down like this:

boundChannel.close().await(5000); bossGroup.shutdownGracefully(0, 10, TimeUnit.SECONDS); workerGroup.shutdownGracefully(0, 10, TimeUnit.SECONDS); bossGroup.terminationFuture().awaitUninterruptibly(10, TimeUnit.SECONDS); workerGroup.terminationFuture().awaitUninterruptibly(10, TimeUnit.SECONDS); SHARED_EVENT_EXECUTOR.shutdownGracefully(0, 10, TimeUnit.SECONDS); SHARED_EVENT_EXECUTOR.terminationFuture().awaitUninterruptibly(10, TimeUnit.SECONDS); 

This however throws a RejectedExecutionException when I have connected clients:

java.util.concurrent.RejectedExecutionException: event executor terminated     at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:703) [netty-all-4.0.13.Final.jar:4.0.13.Final]     at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:296) [netty-all-4.0.13.Final.jar:4.0.13.Final]     at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:691) [netty-all-4.0.13.Final.jar:4.0.13.Final]     at io.netty.channel.DefaultChannelHandlerContext.teardown(DefaultChannelHandlerContext.java:91) ~[netty-all-4.0.13.Final.jar:4.0.13.Final]     at io.netty.channel.DefaultChannelHandlerContext.teardown0(DefaultChannelHandlerContext.java:106) ~[netty-all-4.0.13.Final.jar:4.0.13.Final]     at io.netty.channel.DefaultChannelHandlerContext.access$000(DefaultChannelHandlerContext.java:29) ~[netty-all-4.0.13.Final.jar:4.0.13.Final]     at io.netty.channel.DefaultChannelHandlerContext$1.run(DefaultChannelHandlerContext.java:94) ~[netty-all-4.0.13.Final.jar:4.0.13.Final]     at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:325) [netty-all-4.0.13.Final.jar:4.0.13.Final]     at io.netty.util.concurrent.SingleThreadEventExecutor.confirmShutdown(SingleThreadEventExecutor.java:613) [netty-all-4.0.13.Final.jar:4.0.13.Final]     at io.netty.util.concurrent.DefaultEventExecutor.run(DefaultEventExecutor.java:40) [netty-all-4.0.13.Final.jar:4.0.13.Final]     at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101) [netty-all-4.0.13.Final.jar:4.0.13.Final]     at java.lang.Thread.run(Thread.java:744) [na:1.7.0_45] 

The netty4 documentation according application-shutdown isn't helpful either. Do I have to follow a specific order to shutdown my application?

What I want to achieve is: 1. Stop accepting incoming messages 2. Handle all queued messages, which may involves sending messages

回答1:

When you call shutdown ,if there is any thread putting task into the taskQueue,and the taskQueue is not empty, it would call reject() method to reject your putting action.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!