本文介绍了关闭netty 4应用程序将引发RejectedExecutionException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

让我们假设以下管道:

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

我注册了一个ShutdownHook,它会像这样关闭NettyServer:

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);

但是,当我与客户端建立连接时,这会引发 RejectedExecutionException :

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]

根据应用程序关闭的netty4文档也没有帮助.我必须遵循特定的命令来关闭我的应用程序吗?

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

我想要实现的是: 1.停止接受传入的消息 2.处理所有排队的消息,这可能涉及发送消息

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

推荐答案

调用shutdown时,如果有任何将任务放入taskQueue的线程,而taskQueue不为空,它将调用reject()方法来拒绝您的采取行动.

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.

这篇关于关闭netty 4应用程序将引发RejectedExecutionException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-14 16:01